2

什么时候最好有一个私有数据成员(_valin 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);
}
4

2 回答 2

4

因为class A您只能val在编译时设置或修改,class B仅在运行时。所以这取决于你什么时候有足够的信息来初始化/修改类。此外,非静态数据成员class B添加了每个对象的状态。相反,您可以使用 astatic const int或 an 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")
}
于 2013-08-20T06:43:31.533 回答
0

作为最终结果,A 类的汇编代码将被硬编码,并且对于所有使用的整数都将存在该类的单独版本。每个常量字面整数的自定义类......从某种意义上说,如果您愿意增加代​​码大小以提高执行速度,这就是您要走的路。

无论哪个整数,B 类构造函数都是相同的,并且整数是传入的运行时变量。一个构造函数,因此代码大小不会因您使用的每个不同的常量整数而增加。

于 2013-08-22T00:17:06.367 回答