为什么使用常量表达式作为模板参数
Why using constant expression as a template parameter?
什么时候最好有一个私有数据成员(class B
中的_val
),什么时候最好把val
作为模板参数(class A
)?
#include<iostream>
using namespace std;
template<int val>
class A{
public:
A(){ cout << val << endl;}
};
class B{
public:
B(int val) : _val(val) { cout << val << endl;}
private:
int _val;
};
int main()
{
A<7> a;
B b(8);
}
对于class A
,只能在编译时设置或修改val
,对于class B
,只能在运行时设置或更改。因此,这取决于您何时有足够的信息来初始化/修改类。此外,class B
中的非静态数据成员添加了每个对象的状态。相反,您可以使用static const int
或enum
,它只添加每个类的状态。
更有趣的是,在C++11中,您可以在编译时和运行时使用constexpr
并初始化,这取决于上下文
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")
}
最终,类A的汇编代码将被硬编码,并且该类的单独版本将存在于所有使用的整数中。一个自定义类,用于每一个常量的随机整数。。。。从某种意义上说,如果你愿意增加代码大小以提高执行速度,这就是你的选择。
无论是哪个整数,B类构造函数都是相同的,并且整数是传入的运行时变量。一个构造函数,所以代码大小不会因使用的每个不同的常量整数而增加。
相关文章:
- 概念中的cv限定符需要表达式参数列表
- 在函数中使用 const int size 参数创建数组会在 Visual Studio 中抛出错误 C++:表达式的计
- 表达式 SFINAE:如何根据类型是否包含具有一个或多个参数的函数来选择模板版本
- 使用自动推导的 lambda 参数作为常量表达式
- 编译器是否强制根据模板参数计算表达式?
- 错误:参数中无效地使用了无效表达式
- 将折叠表达式传递给可变参数模板
- 为什么带有指针子对象的文字类类型的 constexpr 表达式不能是非类型模板参数
- C++: priority_queue:模板参数中的 lambda 表达式
- 容器如何处理 lambda 表达式的参数
- 在C++ Lambda 表达式中,为什么人们更喜欢按值捕获而不是作为参数传递?
- 整体模板参数。错误:在常量表达式中使用'this'
- 我可以std::在fold表达式中转发参数吗
- 折叠表达式模板参数推导/替换失败
- 折叠表达式和参数包:static_assert 内 Args&& 和 Args 之间的区别
- C++:从捕获函数参数的函数返回 lambda 表达式
- 是否可以使用带有模板化参数的特征块表达式作为左值?
- 编译器在传递 const 变量时返回错误:模板参数不是常量表达式
- 如何在C++中将 lambda 表达式作为参数传递
- 导出模板参数表达式的类型