指向函数模板实例的指针

时间:2011-12-05 15:37:54

标签: c++ linux templates gcc

我想使用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*)'

3 个答案:

答案 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定义类型,而不是函数)