在constexpr中使用非const变量?

时间:2012-09-26 12:52:23

标签: c++ templates c++11 constexpr

因此,关于使用三元运算符的const / non-const的先前问题,关于C ++ 11标准的以下test函数是否正常:

template<bool UseConst> class MyClass
{
    public:
        constexpr bool test()
        {
             return (UseConst) ? (_constvar) : (_var);
        }

    protected:
        int _var;
        static const int _constvar;
}

整个问题是,_constvar是const,而_var是非const。我必须通过相同的函数根据模板参数访问这两个数据,并且我想在使用const时有一个编译时函数。

test()功能是否满足我的要求?

1 个答案:

答案 0 :(得分:0)

您可以使用SFINAE来“专门化”test功能。换句话说,您可以执行以下操作:

template<bool true_false>
struct true_type
{
    static char value;
};

template<>
struct true_type<false>
{
    static char value[2];
};

template<bool UseConst> class MyClass
{
    private:
        constexpr int pre_test(const char arg) { return _constvar; }
        int pre_test(char (&)[2]) const { return _var; }

    public:
        constexpr int test()
        {
             return pre_test(true_type<UseConst>::value);
        }

    protected:
        int _var;
        static const int _constvar;
};

现在,当您致电MyClass::test时,如果UseConstfalse,则test会降级为运行时功能,但UseConst为{ {1}},您将获得编译时功能。