我正在使用 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/