专门化成员函数,但不是整个类

时间:2016-05-08 10:35:13

标签: c++ templates template-specialization

我有一个使用枚举的模板

template<typename T> class Enumuzaorous : public someclass<T>
{
public:
virtual ~Enumuzaorous() { } ;
virtual void do_this() { ... }
virtual void take_that() { ... }
virtual bool check_something() { return false; } 
T m_value;
}

我有很多使用这个类的枚举和一个枚举:

enum myLovelyEnum
{
today,tomorrow
}

对于这个枚举,我希望check_something不会返回false,但执行以下操作:

bool check_something() { return m_value == today; } 

我可以将整个类专门用于枚举,但我需要复制并粘贴以下的实现:  void do_this() { ... } void take_that() { ... }

是否可以只专注一个成员函数?我猜不是。

也许我应该继承然后专攻?

什么是正确的方法。 也许我可以从专业的do_this打电话,把它拿到通用的那个?

感谢。

2 个答案:

答案 0 :(得分:3)

类模板的成员函数本身就是函数模板,可以明确专门化:

template <>
bool Enumuzaorous<myLovelyEnum>::check_something()
{
     return m_value == today;
}

答案 1 :(得分:0)

另一种解决方案可以是使用特征类

template <typename T> struct DefaultEnumuzaorousTraits
{
  constexpr static bool check_something_impl(T&) { return false; }
};

template<typename T, class Traits = DefaultEnumuzaorousTraits<T>>
class Enumuzaorous : public someclass<T>
{
   // stuff omitted for brevity
   bool check_something() { return Traits::check_something_impl(m_value); }
};

struct DefaultEnumuzaorousTraits<myLovelyEnum>
{
  constexpr static bool check_something_impl(myLovelyEnum e) 
  { return e == myLovelyEnum::today; }
}