我寫了一個小的函數類,它應該能夠通過隱藏一個靜態包裝函數和一個指向該對象的void指針來調用類成員函數。下面的示例在設置包裝函數時由於錯誤而無法編譯。我想要的是一個類成員指針作爲模板參數。有人知道那裏有什麼問題嗎?類成員函數的C++函子模板
我認爲在調用成員函數時,靜態函數中可能存在另一個問題。我不完全知道如何使用模板語法來做到這一點。最小的例子用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'是如何實現的。 – VTT
我忘了提及在這種情況下,沒有stl可用,因爲我在嵌入式系統中使用它。 – Gustavo
相關:https://stackoverflow.com/questions/4298408/5-years-later-is-there-something-better-than-the-fastest-possible-c-delegate –