我目前有一个功能:
template<typename T>
bool func(T &t, int x)
{
// do stuff...
}
但是我希望有三个不同的功能体:
T
是enum
T
正在unsigned char
我已经尝试了this但是没有做到。
这三种情况的正确功能声明是什么?
我能够想出的最接近的是案例1:
template<typename T>
typename std::enable_if< std::is_enum<T>::value, bool >::type func( T &t, int x)
和案例3:
template<typename T>
typename std::enable_if< not std::is_enum<T>::value, bool >::type func( T &t, int x)
然而,我无法为编译的案例2做些工作。作为一种解决方法,我在案例3中有一个if
语句来处理无符号字符,但这并不理想。
答案 0 :(得分:9)
使用标签调度:
namespace details {
template<class T>
bool func( T& t, int x, std::true_type /* is_enum */, std::false_type ) {
}
template<class T>
bool func( T& t, int x, std::false_type, std::true_type /* unsigned char */ ) {
}
template<class T>
bool func( T& t, int x, std::false_type, std::false_type ) {
// neither
}
}
template<class T>
bool func( T& t, int x ) {
return details::func( t, x, std::is_enum<T>{}, std::is_same<unsigned char, T>{} );
}
答案 1 :(得分:2)
将有关重载的评论转为答案:
// For enum
template<typename T>
typename std::enable_if<std::is_enum<T>::value, bool>::type
func(T& t, int x);
// for unsigned char
bool func(unsigned char& t, int x);
// for other
template<typename T>
typename std::enable_if<!std::is_enum<T>::value, bool>::type
func(T& t, int x);
另一种方法是使用unsigned char
的专业化:
// for other
template<typename T>
typename std::enable_if<!std::is_enum<T>::value, bool>::type
func(T& t, int x);
// specialization for unsigned char
template <>
bool func(unsigned char& t, int x);