我有以下代碼:的std :: enable_if前提上的std :: 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;
}
有了這個代碼,我預計func
第一次調用打印出來3
(如int
的確可轉換爲int
,應該叫第一個專業化),第二個要求func
打印出Test
(Test()
不可轉換爲int
,所以應該調用第二個專業化)。但是,我反而得到一個編譯錯誤:
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>’
但是,如果我改變了模板的功能,而不是爲(同時保留一切完全一樣):
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();
}
那麼一切編譯和作品如我所料。這是什麼額外的語法,爲什麼我需要它?
重複[如何std :: enable \ _if工作?](https://stackoverflow.com/questions/25284499/how-does-stdenable-if-work) –