问题
I currently have a function:
template<typename T>
bool func(T &t, int x)
{
// do stuff...
}
However I would like to have three different function bodies:
T
being anenum
T
beingunsigned char
- Everything else
I have tried this already but didn't get far.
What are the correct function declarations for these three cases to work?
The closest I have been able to come up with is Case 1 being:
template<typename T>
typename std::enable_if< std::is_enum<T>::value, bool >::type func( T &t, int x)
and Case 3 being:
template<typename T>
typename std::enable_if< not std::is_enum<T>::value, bool >::type func( T &t, int x)
however I have not been able to make something work for Case 2 that compiles. As a workaround I have an if
statement inside Case 3 to handle unsigned chars but that is not ideal.
回答1:
Use tag dispatching:
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>{} );
}
回答2:
Turn out the comment about overload into answer:
// 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);
Live example
An alternative is to use specialization for 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);
Live example
来源:https://stackoverflow.com/questions/29762892/how-to-specialize-a-template-function-for-enum-and-specific-type