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

标签 c++ templates c++11 constexpr

何时最好使用私有(private)数据成员(B 类 中的 _val)以及何时最好将 val 作为私有(private)数据成员模板参数(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只能在运行时设置或修改。所以这取决于你什么时候有足够的信息来初始化/修改类。此外,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")
}

关于c++ - 为什么使用常量表达式作为模板参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18328487/

相关文章:

c++ - 实例化/模板函数专门化

c++ - 带有 const char* 的奇怪 std::cout 行为

c++ - 函数参数包的行为

c++ - 具有以不同方式实现的可变参数构造函数的模板类 : What are the benefits and downfalls of each version?

c++ - View 和跨步 View 的函数模板特化和 const 噩梦

C++ 11在缺少时提供空的非成员函数

c++ - 在构造函数中使用关键字 "this"时定义复制构造函数

c++ - 将艺术风格与 Visual Studio 2010 集成

c++ - boost asio 计时器不适用于阻塞读取调用

c++ - 为什么静态类变量不能分配到栈中?