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

前端 未结 2 885
终归单人心
终归单人心 2021-01-14 10:40

I currently have a function:

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

However I would like to have thr

相关标签:
2条回答
  • 2021-01-14 11:14

    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

    0 讨论(0)
  • 2021-01-14 11:18

    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>{} );
    }
    
    0 讨论(0)
提交回复
热议问题