私は次のコードを持っている:int
は確かであるとして、このコードでのstd :: STDを前提enable_if :: is_convertible正しくテンプレートを推測ない
#include <iostream>
#include <type_traits>
template <typename T, typename std::enable_if
<std::is_convertible<int, T>::value, T>::type>
void func(T a)
{
std::cout << a << std::endl;
}
template <typename T, typename std::enable_if
<!std::is_convertible<int, T>::value, T>::type>
void func(T a)
{
a.print();
}
class Test
{
public:
void print()
{
std::cout << "Test" << std::endl;
}
};
int main()
{
func(3);
func("Test");
return 0;
}
を、私は(3
をプリントアウトするfunc
の最初の呼び出しを期待しましたint
に変換可能、最初の特殊化を呼び出す必要があります)、を呼び出してTest
を出力します(Test()
はint
に変換されないため、2番目の特殊化を呼び出す必要があります)。
template <typename T, typename std::enable_if
<std::is_convertible<int, T>::value, T>::type* =
nullptr>
void func(T a)
{
std::cout << a << std::endl;
}
template <typename T, typename std::enable_if
<!std::is_convertible<int, T>::value, T>::type* =
nullptr>
void func(T a)
{
a.print();
}
はその後、すべてがコンパイルした作品:(まったく同じ他のすべてを残したまま)、しかし、私が代わりにするテンプレートの機能を変更した場合
prog.cpp: In function ‘int main()’:
prog.cpp:27:8: error: no matching function for call to ‘func(int)’
prog.cpp:5:6: note: candidate: template [class T, typename std::enable_if[std::is_convertible[int, T>::value, T>::type > void func(T)
prog.cpp:5:6: note: template argument deduction/substitution failed:
prog.cpp:27:8: note: couldn't deduce template parameter ‘[anonymous>’
:しかし、私の代わりに、コンパイラのエラーを取得します私の期待通りに。この余分な構文は何ですか、なぜ私はそれを必要としますか?
[std :: enable \ _ifはどのように機能するのですか?](https://stackoverflow.com/questions/25284499/how-does-stdenable-if-work) –