スタティックラッパー関数とオブジェクトへのvoidポインターを隠すことでクラスメンバー関数を呼び出すことができる小さなFunctorクラスがあります。以下の例は、ラッパー関数を設定する際のエラーのためにコンパイルされません。私が望むのは、テンプレート引数としてのクラスメンバポインタです。誰が何が間違っているか知っていますか?クラスメンバー関数のC++ Functorテンプレート
メンバー関数を呼び出すときに静的関数に別の問題があると思います。テンプレート構文でこれをどうやって行うのか正確には分かりません。最小限の例は、gccを有効にしたC++ 11でコンパイルします。
#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);
}
'Functor'に呼び出す' Test'クラスのメンバ関数へのポインタを渡す必要があります。 '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 –