Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.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

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++ 为什么使用常量表达式作为模板参数?_C++_Templates_C++11_Constexpr - Fatal编程技术网

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
类型的对象。下面的列表继续显示。“更好”用于什么?