基本的にstd::enable_if:パラメータとテンプレートパラメータと同じことをしようとしていますが、コードをコンパイルできません。
パラメータにstd::enable_ifがあり、正常に動作する単純な最初のバージョンがありました。
#include <iostream>
#include <type_traits>
template <typename T>
void foo(T t, typename std::enable_if< std::is_same<T, int>::value >::type* = 0) {
std::cout << "int" << std::endl;
}
template <typename T>
void foo(T t, typename std::enable_if< !std::is_same<T, int>::value >::type* = 0) {
std::cout << "not int" << std::endl;
}
int main(int argc, char* argv[])
{
foo(10);
foo(10.1);
return 0;
}
しかし、テンプレートのものが1つの場所にあり、関数の引数からenable_ifが必要な場合は、より簡潔になると思いました。
ここで、enable_if部分を移動するだけで、次のようになります。
#pragma warning(1 : 4519)
#include <iostream>
#include <type_traits>
template <typename T, typename std::enable_if< std::is_same<T, int>::value >::type = 0>
void foo(T t) {
std::cout << "int" << std::endl;
}
template <typename T, typename std::enable_if< !std::is_same<T, int>::value >::type = 0>
void foo(T t) {
std::cout << "not int" << std::endl;
}
int main(int argc, char* argv[])
{
foo(10);
foo(10.1);
return 0;
}
#pragma warning(1:4519)必要だったのは、関数テンプレートのデフォルトの引数がVS2010のエラーであるためです。問題は、それでもコンパイルされないことです。最初のメッセージは次のとおりです。error C2783: 'void foo(T)' : could not deduce template argument for '__formal'
それはやりたくないのですが、次のように呼び出して、必要なテンプレートを明示的に記述してみました。
foo<int, int>(10);
foo<double, double>(10.1);
しかし、それでも機能せず、新しいエラーが発生します。
error C2975: 'foo' : invalid template argument for 'unnamed-parameter', expected compile-time constant expression
誰かがこれを修正する方法を教えてくれることを願っています。もちろん、私のスタイルやコードにある可能性のあるその他の問題に関するすべてのコメントを歓迎します。:)
追加の質問:VS2010がデフォルトで関数テンプレートのデフォルト引数を許可しない理由を誰かが知っていますか?