次の作業コードを検討してください。
#include <iostream>
template<typename T> struct Traits {};
template<typename T, typename A>
struct Traits<void(T::*)(A)>
{
typedef T Class;
typedef A Arg;
};
template<typename T, typename U, void(T::*MemFun)(U)>
void Builder()
{
std::cout << typeid(T).name() << std::endl;
std::cout << typeid(U).name() << std::endl;
std::cout << typeid(MemFun).name() << std::endl;
}
template<typename T, T arg>
void Builder()
{
return Builder<Traits<T>::Class,Traits<T>::Arg,arg>();
}
class Class
{
public:
void foo(int) { }
};
int main()
{
Builder<decltype(&Class::foo), &Class::foo>();
}
私ができるようにしたいのは、マクロを使用せずに同じ結果を得るために、このようなものです。
int main()
{
Builder<&Class::foo>();
}
メンバーへのポインタを取り、型を推測するテンプレートを作成できないようです。何かご意見は?メンバーへのポインターは、テンプレート関数 (表示されていません) の作成に使用されるため、関数パラメーターではなく、テンプレート引数として使用する必要があります。