さまざまな関数を保存し、後でそれらの引数の型を抽出する必要がある機能を作成しようとしています。そのため、関数シグネチャをテンプレート パラメーターとして使用しています。しかし、やや予想外の結果が得られます。コードは次のとおりです。
#include <functional>
#include <iostream>
template <class T>
struct foo
{
foo()
{
std::cout << "class T" << std::endl;
}
};
template <class Ret, class Arg>
struct foo<Ret(Arg)>
{
foo()
{
std::cout << "Ret(Arg)" << std::endl;
}
};
template <class T>
void save(std::function<T>)
{
new foo<T>();
}
int main(int argc, char* argv[])
{
std::function<void(void)> someFoo;
save(someFoo);
return 0;
}
したがって、変数someFoo
がタイプ の関数である場合void(void)
、最初のテンプレート がインスタンス化されますfoo<T>
。しかし、それを に変更するとvoid(int)
、目的の特殊なテンプレートがインスタンス化されます。何故ですか?