类方法上的C++类型特征:如果参数为枚举,则部分专用化

C++ typetraits on class method: partial specialization if parameter is enum

本文关键字:枚举 专用 参数 C++ 类型 特征 如果 类方法      更新时间:2023-10-16

>我的平台是带有Visual Studio Express 2012的Windows。

我有一个模板化方法如下

struct A 
{
    template<class T> void blub(T value);
};

我想有几个专业,如下所示:

template<> void A::blub(std::string value) { /* ... */ }
template<> void A::blub(int value) { /* ... */ }

但是,现在我想包含枚举,以某种方式如下所示:

enum MyEnum { ENUM_1 };
A a;
a.blub(ENUM_1);

当然,这失败了,因为没有针对该类型的专用化。我不知道提前精确枚举,所以我想为一般的枚举派生一个模板专用化。

执行以下操作将使编译失败:

template<class T> void A::blub(const typename std::enable_if<std::is_enum<T>::value, T>::type& value) { /* ... */ }

编译器失败,并显示 C2244。这是有道理的,因为编译器通常无法推断该方法的类型。

这让我得出结论:我想要的是不可能的。对于上述调用,我必须执行以下操作:

A a;
a.blub((int)ENUM_1);

我的结论对吗?我只需要在电话中做演员吗?解决方法是模板化类,但我不想这样做,因为除了该方法之外,该类确实执行了许多其他操作。

您尝试部分专用化函数模板 - 这是不允许的。改为在返回类型上执行此操作:

struct A
{
    template<typename T>
    typename std::enable_if<std::is_enum<T>::value>::type
    blub(T value);
    // and don't specialize for concrete types,
    // just overload:
    void blub(std::string value);
    void blub(int value);
};

活生生的例子。