別の質問に触発されて、その関数を呼び出すために使用される実際の引数を指定して、オーバーロード メンバー関数の型を推測する方法を見つけようとしました。これが私がこれまでに持っているものです:
#include <type_traits>
template<typename F, typename Arg>
struct mem_fun_type {
// perform overload resolution here
typedef decltype(std::declval<F>()(std::declval<Arg>())) result_type;
typedef decltype(static_cast<result_type (F::*)(Arg)>(&F::operator())) type;
};
struct foo {};
struct takes_two
{
void operator()(int);
void operator()(foo);
};
struct take_one {
void operator()(float);
};
int main()
{
static_assert(std::is_same<mem_fun_type<take_one, float>::type,
void (take_one::*)(float)>::value, "Zonk");
static_assert(std::is_same<mem_fun_type<takes_two, double>::type,
void (takes_two::*)(float)>::value, "Zonk");
return 0;
}
テンプレート パラメーター Arg が実際の型と一致する限り、static_cast は成功しますが、これはオーバーロード解決 (完全一致) の最も単純なケースにすぎません。テンプレートのメタプログラミングで完全なオーバーロード解決プロセスを実行することは可能ですか?
これは純粋に仮説であり、実際の使用を意図したものではありません。