c++ - 将 void* 转换为模板类型时不知道模板参数类型

标签 c++ templates generics

我正在使用 pthreads 库,当我创建一个线程时,我将指针指向一个模板类型的对象。

我对模板没有经验(今天才读到),需要将 pthread 运行的方法声明中的 void* 参数强制转换为模板化类型,以便我可以访问其成员。简而言之,看起来像这样:

简而言之是这样的:

template <typename T>
class A {
    ...
    ...
    ...
    void aMember() { ... }
};

int main() {
    A<int> a;

    pthread_create(..., ..., &run, &a);

    ...
    ...
    ...
}

void *run(void *arg) {
    (A*)arg->aMember()
}

我的问题是我收到了所有这些我不知道如何纠正的错误。我确实确实了解错误,但不知道解决方案。以下是错误:

错误:在 ( 标记之前需要主表达式 错误:在 * 标记之前缺少模板参数 错误:在 ) 标记之前需要主表达式 错误:应在“信息”之前使用“)”

当我在线程中转换一次时,我只是不明白我怎么知道 A 的参数类型?

我正在使用《C++ 模板:完整指南》一书作为引用/学习资源,必须说我对完全理解模板所需的所有信息感到不知所措。我想知道是否有人可以解决这个问题,或者可以指出另一个可能提供答案的资源的方向。

一如既往,我非常感谢您的帮助。

编辑/更新

似乎为我的问题添加上下文可能会有所帮助。或者,也许有人可以使用不同的设计提供不同的解决方案。

我正在使用 libcurl 发出 HTTP 请求,并根据收到的响应创建一个特定类型的对象(因此是模板)。我为我想发出的每个请求创建一个新线程,以便所有内容都异步运行。

最佳答案

template<typename T>
void *run(void *arg) {
    static_cast<A<T>*>(arg)->aMember();
}

int main() {
    A<int> a;

    pthread_create(..., ..., &run<int>, &a);

    ...
    ...
    ...
}

这确实像您的原始代码片段一样,依赖于 extern "C++"调用约定与您的 pthread 库使用的相同。我不确定 POSIX 是否要求它们相同,但如果它们不同,你就不走运了,因为你不能给函数模板 C 语言链接。

关于c++ - 将 void* 转换为模板类型时不知道模板参数类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5589166/

相关文章:

javascript - 将文件从React.JS前端移动到C++后端

c++ - MFC 和 UI 自动化支持

c++ - 找出不相交集的数量

带有模板参数的函数的 C++ 函数包装器

templates - Bamboo CI 计划模板?

c++ - 如何将指向 GLEW 函数的指针传递给模板?

java - 为什么 ArrayList<ArrayList<?>> list = new ArrayList<ArrayList<String>>() 无法编译?

c# - C# 中的泛型和访问 T 的静态成员

C++ 从 std::vector<std::function<...>> 中删除 std::function

c# - 将泛型类型的实例返回到在运行时解析的函数