我想使用thunk函数模板将它传递给pthread_create和类似的东西。
我希望编译器使用给定的参数实例化函数,所有信息都在那里,然后使用typedef作为函数ptr传递给那些函数。
#include <string>
class ServerImpl{
public:
ServerImpl(std::string host, int port);
void run();
};
template<typename T,void (T::*mem_fn)()>
void *thunk(void *obj) {
(static_cast<T*>(obj)->*mem_fn)();
return 0;
}
typedef void *(*Function) (void);
Function fun = (Function)&thunk<ServerImpl,&ServerImpl::run>;
fun();
只是改变了它
看到这一点,我得到一个链接器错误,这就是它带给我前一个错误。省略我应该传递一个对象的事实。
Server.o: In function `ServerImpl::ServerImpl(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, int)':
Server.cpp:(.text+0x11f): undefined reference to `void* thunk<ServerImpl, &(ServerImpl::run())>(void*)'
答案 0 :(得分:3)
thunk
是一个功能模板。你如何使用typedef
?这没有意义。它不是类型。您只能在类型上应用typedef
。
你应该这样做:
ServerImpl *arg = new ServerImpl(); //why do I use new?
pthread_create(&thread_id, NULL, &thunk<ServerImpl,&ServerImpl::run>, arg);
你对pthread_create
的论证是错误的。它需要4个参数,而不是2个。
我使用ServerImpl
创建了new
的实例,因为即使您创建线程的函数已经返回,实例也必须存在。如果我不使用new
创建实例,而是使用局部变量,那么代码会调用未定义的行为,如果函数返回但线程继续运行。
回复你的编辑:
Function fun = (Function)&thunk<ServerImpl,&ServerImpl::run>;
fun();
这是错误的。因为thunk
有一个参数。所以你应该这样做:
Function fun = (Function)&thunk<ServerImpl,&ServerImpl::run>;
fun(new ServerImpl); //pass an argument
在您传递的参数上调用成员函数run
。
答案 1 :(得分:1)
错误很明显。这就像试图做
void f() { }
typedef f blah;
或
int a;
typedef a something;
你只需要做
pthread_create(&thread_id, &thunk<ServerImpl, &ServerImpl::run>);
或者如果您愿意:
auto threadproc = &thunk<ServerImpl, &ServerImpl::run>;
pthread_create(&thread_id, threadproc);
而且,在风格方面,请在参数列表中的每个逗号后使用空格:)
答案 2 :(得分:0)
我不知道编译器是否试图告诉你,但thunk
的签名不使用任何模板类型,你期望编译器如何猜测它?
pthread_create期待函数不是类型(typedef fun定义类型,而不是函数)