Пример кода 1:
namespace detail {
enum enabler { dummy };
}
class foo {
public:
template <typename T,
typename std::enable_if<!std::is_integral<T>::value,
detail::enabler>::type = detail::enabler::dummy>
void func(T t) {
std::cout << "other" << std::endl;
}
template <typename T,
typename std::enable_if<std::is_integral<T>::value,
detail::enabler>::type = detail::enabler::dummy>
void func(T t) {
std::cout << "integral" << std::endl;
}
};
Пример кода 2:
namespace detail {
enum enabler { dummy };
}
class foo {
public:
template <typename T,
typename T2 = typename std::enable_if<!std::is_integral<T>::value, detail::enabler>::type>
void func(T t) {
std::cout << "other" << std::endl;
}
template <typename T,
typename T2 = typename std::enable_if<std::is_integral<T>::value, detail::enabler>::type>
void func(T t) {
std::cout << "integral" << std::endl;
}
};
Я понимаю, почему образец 2 не компилируется. В основном потому, что обе функции шаблона похожи друг на друга (они даже имеют одинаковые параметры шаблона T
, T2
).
Я не понимаю, почему скомпилирован образец 1! Я вижу, что это та же проблема. В основном вместо того, чтобы иметь второй параметр шаблона как typename
, на этот раз он enum
вместо typename
.
Может кто-нибудь объяснить, пожалуйста?
Далее я выполнил следующий фрагмент кода, и он вернул true, что еще более запутанно! (имеет смысл, что это правда, но запутывает, что скомпилирован образец 1)
std::cout
<< std::boolalpha
<< std::is_same<std::enable_if<std::is_integral<int>::value, int>::type,
std::enable_if<!std::is_integral<float>::value, int>::type>::value
<< std::endl;