他にも同様の質問がたくさんあることは知っていますが、私が見たものはどれも私がやっていることには当てはまらないようです. 私が持っているものの要旨は次のとおりです。
template <typename T>
void CallFn(T *p, void (T::*pfn)(void))
{
(p->*pfn)();
}
次を使用して呼び出されます:
class Foo
{
public:
void Bar(void);
}
...
Foo *p = ...
CallFn(p, &Foo::Bar);
しかし、コンパイラがメンバー関数へのポインタのテンプレート引数を推測できなかったというエラーが表示されます。代わりに次のような構造体を使用すると:
template <typename T>
class Wrapper
{
public:
void operator()(T *p, void (T::*pfn)(void))
{
(p->*pfn)();
}
};
...
Foo *p = ...
Wrapper<Foo> x;
x(p, &Foo::Bar);
それは機能しますが、構文ははるかに恐ろしいものです。コンパイラがクラスのメンバー関数の型を推測できるのに、関数の型を推測できないのはなぜだろうと思っていました。