質問に答えながら、メンバー関数のシグネチャの型定義にテンプレート エイリアスを利用することを提案しました。つまり、メンバー関数を型定義するだけでなく、メソッドを含むターゲット クラスを除外できます。
template<typename T>
using memberf_pointer = int (T::*)(int, int);
これは質問が尋ねたことをカバーしているように見えますが、任意の関数引数に対して一般化しようとしました:
template<typename T, typename... Args>
using memberf_pointer = int (T::*)(Args&&...);
引数推定の問題で失敗します (基本的に、空の引数リストを想定しています)。ここにデモがあります:
#include <iostream>
class foo
{
public:
int g (int x, int y) { return x + y ; }
};
template<typename T, typename...Args>
using memberf_pointer = int (T::*)(Args&&...);
int main()
{
foo f ;
memberf_pointer<foo> mp = &foo::g ;
std::cout << (f.*mp) (5, 8) << std::endl ;
}
どうしてこれなの?それを機能させる方法はありますか?