2013-08-20 111 views
2

當它是最好有一個私有數據成員(_valclass 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); 
} 
+3

你想在運行時更改值?然後你在那裏得到你的答案。 –

+1

@chuck編號模板是一個編譯時構造。 – Rapptz

+0

@chuck,如何創建對象'甲<7> A'後改變從7'val'至8? – cpp

回答

3

class A只能設置或僅在運行時修改val在編譯時,爲class B。所以這取決於你何時有足夠的信息來初始化/修改課程。此外,class B中的非靜態數據成員會添加每個對象的狀態。相反,你可以使用一個static const intenum,這隻會增加每級的狀態。

更有趣的是,在C++ 11你可以使用constexpr和在編譯時和運行時,既initalize取決於上下文

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") 
} 
0

作爲最終的結果,對於A類的彙編代碼將被硬編碼,並且對於所有使用的整數將存在該類的單獨版本。爲每個常量輸出整數的自定義類....從某種意義上說,如果您願意增加代​​碼大小以提高執行速度,這就是要走的路。

B類的構造函數將是無論哪個整數相同,該整數是,一個構造函數傳遞運行時間變量,因此代碼大小不會增加您使用的每個不同的恆定整數。

相關問題