在 constexpr 中使用非常量变量

Using non-const variable inside constexpr?

本文关键字:非常 常量 变量 constexpr      更新时间:2023-10-16

因此,对于之前关于三元运算符的常量/非常量的问题,以下test函数对于 C++11 标准是否正常:

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

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

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

您可以使用

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时,如果UseConst falsetest会降级为运行时函数,但是当UseConst true时,你会得到一个编译时函数。