我写了一个小的函数对象类,应该能够通过隐藏静态包装函数和指向对象的void指针来调用类成员函数。下面的示例由于设置包装函数时出现错误而无法编译。我想要的是将类成员指针作为模板参数。有人知道那里出了什么问题吗?
我认为静态函数在调用成员函数时可能会有另一个问题。我不确定如何使用模板语法来解决这个问题。启用了C++11的gcc可以编译最简示例。
我认为静态函数在调用成员函数时可能会有另一个问题。我不确定如何使用模板语法来解决这个问题。启用了C++11的gcc可以编译最简示例。
#include <iostream>
template<class TReturn, class... TParameter>
struct Functor {
TReturn (*ptr)(void*, TParameter...);
void *object;
template<class TObject, class TMemberFunction>
static TReturn memberCaller(void *obj, TParameter... params) {
TObject *c = static_cast<TObject*>(obj);
return (c->*(TObject::TMemberFunction))(params...);
}
TReturn operator()(TParameter... params) {
return ptr(object, params...);
}
};
class Test {
public:
void func(int a) {
std::cout << a << std::endl;
}
};
int main(int argc, const char **argv) {
Functor<void, int> f;
Test t;
f.object = &t;
f.ptr = &Functor<void, int>::memberCaller<Test, Test::func>;
f(100);
}
Test
类中你想要调用的成员函数的指针传递给Functor
。TMemberFunction
不是类型名称。实际上,你可以查找一下std::function
或fastdelegate
是如何实现的。 - user7860670