繁体   English   中英

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

[英]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 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类构造函数都是相同的,并且该整数是传入的运行时变量。一个构造函数,因此对于使用的每个不同的常量整数,代码大小不会增加。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM