最好是拥有私人数据成员(_val
中的class B
),何时最好将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);
}
答案 0 :(得分:3)
对于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")
}
答案 1 :(得分:0)
作为最终结果,A类的汇编代码将被硬编码,并且对于所有使用的整数,将存在该类的单独版本。每个常量litteral整数的自定义类....从某种意义上说,如果你愿意增加代码大小以提高执行速度,这就是你要采用的方法。
无论哪个整数,B类构造函数都是相同的,并且整数是传入的运行时变量。一个构造函数,因此对于您使用的每个不同的常量整数,代码大小不会增加。