Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在constexpr中使用非const变量?_C++_Templates_C++11_Constexpr - Fatal编程技术网

C++ 在constexpr中使用非const变量?

C++ 在constexpr中使用非const变量?,c++,templates,c++11,constexpr,C++,Templates,C++11,Constexpr,因此,对于前面关于三元运算符常量/非常量的问题,关于C++11标准,以下test函数是否正常: template<bool UseConst> class MyClass { public: constexpr bool test() { return (UseConst) ? (_constvar) : (_var); } protected: int _var;

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

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

    protected:
        int _var;
        static const int _constvar;
}
模板类MyClass
{
公众:
constexpr bool测试()
{
返回(UseConst)?(\u constvar):(\u var);
}
受保护的:
int_var;
静态常数int_consvar;
}
整个问题是,
\u constvar
是常量,
\u var
是非常量。根据模板参数,我必须通过同一个函数访问这两个数据,我希望在使用const时使用编译时函数


test()
函数满足我的要求吗?

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

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;
};
模板
结构真实类型
{
静态字符值;
};
模板
结构真实类型
{
静态字符值[2];
};
模板类MyClass
{
私人:
constexpr int pre_test(const char arg){return_constvar;}
int pre_test(char(&)[2])const{return_var;}
公众:
constexpr int test()
{
返回预测试(真类型::值);
}
受保护的:
int_var;
静态常数int_consvar;
};

现在,当您调用
MyClass::test
时,如果
UseConst
false
test
将降级为运行时函数,但是当
UseConst
true
时,您将得到一个编译时函数。

您可以使用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;
};
模板
结构真实类型
{
静态字符值;
};
模板
结构真实类型
{
静态字符值[2];
};
模板类MyClass
{
私人:
constexpr int pre_test(const char arg){return_constvar;}
int pre_test(char(&)[2])const{return_var;}
公众:
constexpr int test()
{
返回预测试(真类型::值);
}
受保护的:
int_var;
静态常数int_consvar;
};

现在,当您调用
MyClass::test
时,如果
UseConst
false
test
将降级为一个运行时函数,但是当
UseConst
true
时,您将得到一个编译时函数。

为什么不简单地专门化
UseConst
并从那里开始呢?专门化什么?类还是函数?对于这个类,我有一大组函数,通过像这里这样的单个函数来检索常量或非常量将更加简单和简洁。要专门化这个函数,我不知道怎么做…@Vincent:类模板中的非模板成员函数实际上只是函数模板,可以专门化,而不必专门化整个类。例如,请参见中的代码。是否应
test()
返回
int
?让这个测试函数
constexpr
有什么问题?它为我编译。为什么不简单地专门研究
UseConst
,然后从那里开始呢?专门研究什么?类还是函数?对于这个类,我有一大组函数,通过像这里这样的单个函数来检索常量或非常量将更加简单和简洁。要专门化这个函数,我不知道怎么做…@Vincent:类模板中的非模板成员函数实际上只是函数模板,可以专门化,而不必专门化整个类。例如,请参见中的代码。是否应
test()
返回
int
?让这个测试函数
constexpr
有什么问题?它为我编译。