使用std :: is_same进行元编程

时间:2014-12-16 12:04:58

标签: c++ template-meta-programming

是否可以执行以下编译而不使用模板专业化的内容?

template <class T> 
class A {
public:
  #if std::is_same<T,int>
  void has_int() {}
  #elif std::is_same<T,char>
  void has_char() {}
  #endif
};
A<int> a; a.has_int();
A<char> b; b.has_char();

2 个答案:

答案 0 :(得分:19)

是。制作功能模板,然后使用std::enable_if

条件启用它们
#include <type_traits>

template <class T> 
class A {
public:

  template<typename U = T>
  typename std::enable_if<std::is_same<U,int>::value>::type
  has_int() {}

  template<typename U = T>
  typename std::enable_if<std::is_same<U,char>::value>::type
  has_char() {}
};

int main()
{
    A<int> a;
    a.has_int();   // OK
    // a.has_char();  // error
}

如果类很大并且有许多函数需要T,那么来自the other answer的解决方案可能不可行。但是你可以通过继承另一个只用于这些特殊方法的类来解决这个问题。然后,您可以专门化该基类。

在C ++ 14中,有方便的类型别名,因此语法可以变为:

std::enable_if_t<std::is_same<U, int>::value>

和C ++ 17,甚至更短:

std::enable_if_t<std::is_same_v<U, int>>

答案 1 :(得分:4)

是的,使用模板专业化:

template <class T> 
class A;

template <> 
class A<int>
{
    void had_int(){}
};

template <> 
class A<char>
{
    void had_char(){}
};