特化一个成员函数但不是整个 class

Specialize a member function but not entire class

我有一个使用枚举的模板

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;
}

我有很多枚举都使用了这个 class 还有一个枚举:

enum myLovelyEnum
{
today,tomorrow
}

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

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

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

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

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

正确的做法是什么。 也许我可以从专门的 do_this、take_that 调用通用的?

谢谢。

class 模板的成员函数本身就是函数模板,可以明确特化:

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

另一种解决方案是使用特征 class

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; }
}