是否可以在模板化类中进行方法和变量的条件声明?

时间:2013-07-31 20:10:09

标签: c++ templates

我正在尝试创建一个可以通过模板参数控制函数和成员的类。我在考虑这样的事情。

template<int control>
class ControlledDeclaration
{
public:
    if(1 == control)
        int Get() { return 0; }
    else if(2 == control)
        char* Get() { return "get"; }
    else if (3 == control)
        bool Get() { return true; }
};

void test_template()
{
    ControlledDeclaration<1> c_int;
    ControlledDeclaration<2> tx_int;
    ControlledDeclaration<3> b_int;
}

如果可能,怎么做?

2 个答案:

答案 0 :(得分:2)

我将使用的方法是在traits类中专门化细节,并使用模板提供界面。在这个简单的例子中,使用特征并没有太多的好处而不是专门化实际类型,但一般来说,定制几个变量点比使用特征更容易使用特征。

template <int> struct ControlDeclarationTraits;
template <>
struct ControlDeclarationTraits<1> {
    typedef int type;
    static int value() { return 0; };
};

template <>
struct ControlDeclarationTraits<2> {
    typedef char const* type;
    static char const* value() { return "get"; }
};

template <>
struct ControlDeclarationTraits<3> {
    typedef bool type;
    static bool value() { return true; }
};

template<int control>
class ControlledDeclaration
{
public:
    typename ControlDeclarationTraits<control>::type Get() {
        return ControlDeclarationTraits<control>::value();
    }
};

顺便说一句,字符串文字的类型是char const[n](对于合适的n)而不是char[n],即你不能真正使用字符串文字来初始化{{1} 1}}。它确实有效,因为认为有必要支持现有代码将字符串文字分配给char*但它实际上是一个谎言:尝试为任何值分配值会导致未定义的行为。制作指针char*表明内容不应被修改。

答案 1 :(得分:1)

查看boost::enable_if,这完全符合您的要求。