C++ 在constexpr中使用非const变量?
因此,对于前面关于三元运算符常量/非常量的问题,关于C++11标准,以下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;
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
有什么问题?它为我编译。