如何为枚举和特定类型专门化模板函数?

时间:2015-04-21 04:26:12

标签: c++ templates c++11 sfinae

我目前有一个功能:

template<typename T> 
bool func(T &t, int x)
{
    // do stuff...
}

但是我希望有三个不同的功能体:

  1. Tenum
  2. T正在unsigned char
  3. 其他所有
  4. 我已经尝试了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语句来处理无符号字符,但这并不理想。

2 个答案:

答案 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);

Live example

另一种方法是使用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