基于枚举参数调用专门的模板方法

Call specialized template method basing on enum argument

我在处理模板专业化时遇到了问题。我想要一个以枚举作为参数的方法,并根据它调用专门的模板化方法。介绍如下:

#include <iostream>

enum EnumType
{
    ENUM1,
    ENUM2,
    ENUM3
};

class Test
{
public:
    template <EnumType enumType>
    bool enumFunc(const int i )
    {
        std::cout << i << " default\n";
        return false;
    }

    bool func(const EnumType e);
};

template<>
bool Test::enumFunc<ENUM2>(const int i )
{
    std::cout << i << " ENUM2 \n";
    return true;
}
//... and other specializations

bool Test::func(const EnumType e)
{
    // this one works
    // return enumFunc<ENUM2>(3);

    // but this:
    // error: no matching function for call to 'Test::enumFunc<e>(int)
    return enumFunc<e>(3);
}

int main()
{
    Test a;
    a.enumFunc<ENUM2>(2); // works

    a.func(ENUM2); // doesnt even get there due to previous error

    return 0;
}

如评论中所述,参数 e 的值仅在 运行 处已知时间,因此您不能使用模板特化(在 compile 时间评估)。以下可能是您 Test::func():

最简单的实现
bool Test::func(const EnumType e)
{
    switch (e) {
        case ENUM1: return enumFunc<ENUM1>(3);
        case ENUM2: return enumFunc<ENUM2>(3);
        case ENUM3: return enumFunc<ENUM3>(3);
    }
    return false; // Handle error condition(s)
}