何时最好使用私有(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 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")
}
关于c++ - 为什么使用常量表达式作为模板参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18328487/