如何通过类模板的参数指定成员函数(内部类更好)?

时间:2015-01-25 17:14:07

标签: c++ class templates

我有一些像

这样的课程
enum Type {ONE, TWO};

template <enum Type T>
class A {
    void foo() {}
};

我想根据类的模板参数foo()指定函数T。是否有可能在课堂上完成?或者,如何在课外进行?

修改

如果我的班级

怎么办?
template <class U, enum Type T>
class A {
    void foo() {}
};

通过提供foo的两个版本,这个类不能简单地专业化 我在What is wrong with partial template specialization?找到了一个解决方案 这可能会使代码变得很长。

有没有其他解决方案,还是应该使用其他设计?

1 个答案:

答案 0 :(得分:2)

您可以显式专门化类模板的成员函数。你只需:

template <>
void A<ONE>::foo()
{
//ONE stuff
}

或者,您可以使用标记分派。在这个特殊情况下,它们没有多大意义,但如果您的要求略有不同,它们可能会有所不同。

template <enum Type T>
class A
{
public:
  void foo() {fooImpl(std::conditional_t<T==ONE, std::true_type, std::false_type>());}

  void fooImpl(std::true_type)
  {
    cout << "ONE" << endl; 
  }

  void fooImpl(std::false_type)
  {
    cout << "TWO" << endl; 
  }
};

根据上述定义,

int main()
{
  A<ONE>().foo();
  A<TWO>().foo();
  return 0;
}

打印

ONE
TWO