为什么使用常量表达式作为模板参数

Why using constant expression as a template parameter?

本文关键字:参数 表达式 常量 为什么      更新时间:2023-10-16

什么时候最好有一个私有数据成员(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 intenum,它只添加每个类的状态。

更有趣的是,在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类构造函数都是相同的,并且整数是传入的运行时变量。一个构造函数,所以代码大小不会因使用的每个不同的常量整数而增加。