Прежде всего, вы смешиваете SFINAE со специализацией функции . Так не пойдет. Вам нужно выбрать один.
Во-вторых, включить if всегда true
, поэтому он будет всегда выбран, независимо от того, что это за T
.
std::enable_if_t<true, T>
// ^^^^
Вам нужен следующие (в c ++ 11 ) для работы SFINAE:
#include <type_traits> // std::is_same
namespace utils
{
template<typename T>
typename std::enable_if<!std::is_same<IPoint, T>::value, T>::type // T != IPoint
print(const std::string& s)
{
return 0;
}
template<typename T>
typename std::enable_if<std::is_same<IPoint, T>::value, T>::type // T == IPoint
print(const std::string& s)
{
return IPoint(0, 0);
}
}
В качестве примечания, в c ++ 17 это будет сокращено до одной единственной функции шаблона с использованием if constexpr
namespace utils
{
template<typename T>
auto print(const std::string& s)
{
if constexpr (std::is_same<IPoint, T>::value)
return IPoint(0, 0);
else
return 0;
}
}