メンバー関数をパラメーターとして受け取るテンプレート関数を作成しました。
ただし、メンバー関数パラメーターの一部として使用する前にクラスを宣言する必要があるため、別のパラメーターにする必要があります。
template<typename C, void (C::*Method)(void)>
function<void(C*)> methodWrap()
{
}
つまり、テンプレートを明示的にインスタンス化するとき (メンバー ポインターを引数として渡すのではなく、これらのラッパーをコンパイル時に生成する必要があります)、使用するときに 2 回入力する必要があります。
function<void(C*)> someFunc = wrapMethod<SomeClass, &SomeClass::someMethod>();
なぜ私はtisのようなものを書くことができないのですか:
template<void (C::*Method)(void)>
function<void(C*)> methodWrap()
{
}
SomeClass を 2 回入力することなく、C の型とそのメンバー関数ポインターをキャプチャできるようにしますか?
または、C を「自由変数」として宣言し、推論を実行する内部テンプレート引数を持つ外部テンプレートでそれをラップできないのはなぜですか
template<typename C>
template<void (C::*Method)(void)>
function<void(C*)> methodWrap()
{
}