2010-01-31 17 views
49

我想知道當使用模板元編程技術時,使用靜態常量和枚舉hack之間有什麼區別。模板元編程 - 使用Enum Hack和Static Const之間的區別

EX:(TMP通過斐波那契)

template< int n > struct TMPFib { 
    static const int val = 
    TMPFib< n-1 >::val + TMPFib< n-2 >::val; 
}; 

template<> struct TMPFib<1> { 
    static const int val = 1; 
}; 

template<> struct TMPFib<0> { 
    static const int val = 0; 
}; 

template< int n > struct TMPFib { 
    enum { 
    val = TMPFib< n-1 >::val + TMPFib< n-2 >::val 
    }; 
}; 

template<> struct TMPFib<1> { 
    enum { val = 1 }; 
}; 

template<> struct TMPFib<0> { 
    enum { val = 0 }; 
}; 

爲什麼要使用一個比其他?我讀過enum hack是在類內部支持static const之前使用的,但爲什麼現在要使用呢?

+0

+1:確實是一個很好的問題,我還想看看除了明顯的答案之外,答案會是什麼。 – 2010-01-31 17:57:42

+2

static const允許int以外的類型。雙例如。 – 2010-06-15 12:53:52

回答

34

枚舉不lvals,靜態成員的值,如果按引用傳遞的模板將被實例:

void f(const int&); 
f(TMPFib<1>::value); 

如果你想要做純編譯時間計算等,這是不期望的副作用。

主要的歷史區別在於,枚舉也適用於不支持成員值的類初始化的編譯器,現在大多數編譯器都應該修復這個問題。
枚舉和靜態常量之間的編譯速度也可能存在差異。

增強檔案中有關於此主題的boost coding guidelinesolder thread中有一些詳細信息。

12

對於有些人來說,前者可能看起來不像是黑客,更自然。此外,如果您使用該類,則會爲其自身分配內存,因此您可以使用val的地址。

後者更好的支持一些較老的編譯器。

+0

謝謝。這正是我所尋找的答案。 – Anonymous 2010-01-31 18:16:11

+1

我個人完全不同意。然後枚舉版本看起來更自然。爲什麼需要物理變量?枚舉是const值的表示。使用靜態const int看起來更像是後退一步,因爲我們不得不使用宏來表示常量值。 – 2010-01-31 18:48:30

+2

@Martin,關鍵字枚舉與計算有什麼關係?但是要點 - 每個人都可以有自己的觀點。 – 2010-01-31 18:51:53

1

另一方面@Georg的答案是,當一個包含靜態常量變量的結構在專門的模板中定義時,它需要在源代碼中聲明,以便鏈接程序可以找到它並實際給它一個地址被引用。這可能會不必要地(取決於所需的效果)導致不雅的代碼,特別是如果您嘗試創建僅頭文件的庫。您可以通過將值轉換爲返回值的函數來解決此問題,也可以將模板打開爲運行時信息。

相關問題