別の質問からインスパイアされました。 を呼び出すために実際の引数が指定されていると、オーバーロードメンバー関数のタイプ を推測する方法を見つけました。 テンプレートのメタプログラミングでオーバーロードの解決を実行する
#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は成功しますが、これが唯一の オーバーロードの解決(完全一致)の最も平凡なケースである:ここでは私がこれまで持っているものです。テンプレートメタプログラミングで 完全なオーバーロード解決プロセスを実行することは可能ですか?
これはまったく仮定的であり、実際の使用には向いていません。
これは純粋な実例です。私は昨日、「boost :: bind-vs-std :: bind」の問題でそれを打ちました! – vines
私はここであなたが話した質問に答えました(http://stackoverflow.com/a/8938409/147192)。クライアントの助けがなければ、私はちょうど過負荷の解決について推論する方法を見ない。 –
あなたは処罰のための大食犬です。 –