2

我的平台是带有 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);

我的结论对吗?我只需要在通话中进行演员表吗?一种解决方法是将类模板化,但我不想这样做,因为除了该方法之外,该类确实做了很多其他事情。

4

1 回答 1

3

您的尝试试图对函数模板进行部分专门化——这是不允许的。相反,在返回类型上这样做:

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

活生生的例子。

于 2013-09-18T19:11:12.543 回答