C++ 为什么使用常量表达式作为模板参数?
何时最好在C++ 为什么使用常量表达式作为模板参数?,c++,templates,c++11,constexpr,C++,Templates,C++11,Constexpr,何时最好在类别B中有一个私有数据成员(\u val),何时最好将val作为模板参数(类别a) #包括 使用名称空间std; 模板 甲级{ 公众: (){cout对于class A您只能在编译时设置或修改val,对于class B您只能在运行时设置或修改。因此,这取决于您何时有足够的信息来初始化/修改类。此外,class B中的非静态数据成员添加每个对象状态。相反,您可以使用static const int或一个enum,它只添加每个类的状态 更有趣的是,在C++11中,您可以使用constepr
类别B
中有一个私有数据成员(\u val
),何时最好将val
作为模板参数(类别a
)
#包括
使用名称空间std;
模板
甲级{
公众:
(){cout对于class A
您只能在编译时设置或修改val
,对于class B
您只能在运行时设置或修改。因此,这取决于您何时有足够的信息来初始化/修改类。此外,class B
中的非静态数据成员添加每个对象状态。相反,您可以使用static const int
或一个enum
,它只添加每个类的状态
更有趣的是,在C++11中,您可以使用constepr
,并根据上下文在编译时和运行时进行初始化
class C {
public:
constexpr C(int val) : _val(val) {}
constexpr int the_val() { return _val; }
private:
int _val;
}
int main()
{
constexpr C c(5);
A<c.theval()> a; // uses constexpr to set template parameter at compile-time
B b(c.theval()); // can be done at compile-time, but not required ("quality of implementation")
}
C类{
公众:
constexpr C(int val):_val(val){}
constexpr int the_val(){return_val;}
私人:
国际价值;
}
int main()
{
constexpr C(5);
A;//使用constexpr在编译时设置模板参数
B(c.theval());//可以在编译时完成,但不是必需的(“实现质量”)
}
对于类A
您只能在编译时设置或修改val
,对于类B
只能在运行时设置或修改。因此,这取决于您何时有足够的信息来初始化/修改类。此外,类B
中的非静态数据成员会添加每个对象状态。相反,您可以使用静态const int
或一个enum
,它只添加每个类的状态
更有趣的是,在C++11中,您可以使用constepr
,并根据上下文在编译时和运行时进行初始化
class C {
public:
constexpr C(int val) : _val(val) {}
constexpr int the_val() { return _val; }
private:
int _val;
}
int main()
{
constexpr C c(5);
A<c.theval()> a; // uses constexpr to set template parameter at compile-time
B b(c.theval()); // can be done at compile-time, but not required ("quality of implementation")
}
C类{
公众:
constexpr C(int val):_val(val){}
constexpr int the_val(){return_val;}
私人:
国际价值;
}
int main()
{
constexpr C(5);
A;//使用constexpr在编译时设置模板参数
B(c.theval());//可以在编译时完成,但不是必需的(“实现质量”)
}
作为最终结果,类A的汇编代码将被硬编码,并且对于所有使用的整数将存在一个单独的类版本。对于每个常量的一般整数都有一个自定义类……从某种意义上说,如果您愿意增加代码大小以提高执行速度,这是一种方法
无论是哪个整数,B类构造函数都是相同的,并且整数是传入的运行时变量。一个构造函数,因此对于您使用的每个不同的常量整数,代码大小不会增加。最终结果是,a类的汇编代码将是硬编码的,并且该类的一个单独版本将存在于所有使用的构造函数中整数。一个用于每个常量的自定义类。从某种意义上说,如果您愿意增加代码大小以提高执行速度,这是一种方法
无论是哪个整数,B类构造函数都是相同的,并且整数是传入的运行时变量。一个构造函数,因此代码大小不会随使用的每个不同常量整数而增加。是否要在运行时更改该值?然后您就有了答案。@chuck否。模板是编译时构造。@chuck,如何将val
从7更改为8在创建对象A
之后?@cpp您不能更改模板参数,它是类的固定属性。这些情况完全不同。带有非类型参数的类模板将为每个不同的值创建一个新类型。改为使用私有成员将使此为int
a每个对象属性,也就是说,可以有类型为B
的对象具有不同的\u val
值。列表继续:“更好”为什么?你想在运行时更改值吗?然后你就有了答案。@chuck否。模板是编译时构造。@chuck,在创建对象a a
后如何将val
从7更改为8?@cpp你不能更改模板参数,它是类的固定属性。这些情况完全不同。a c带有非类型参数的lass模板将为每个不同的值创建一个新类型。改为使用私有成员将使此int
成为每个对象属性,也就是说,可以存在具有不同\u val
值的B
类型的对象。下面的列表继续显示。“更好”用于什么?