How to specialize a template function for enum, and specific type?

孤街浪徒 提交于 2020-01-11 06:20:03

问题


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:

  1. T being an enum
  2. T being unsigned char
  3. 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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!