2010-10-07 15 views
2

我有一個問題。這樣做更好。C++模板:關於哪個更好的使用方法以及爲什麼

typedef enum{ 
    One = 1, 
    Two = 2 
} Number; 

template< typename T, Number num > 
void foo(const T& param) 
{ 
} 

or 

template< typename T > 
void foo(const T& param, Number num) 
{ 
} 

基本上我在找的是什麼,這兩種方法有什麼不同?如果我必須使用哪一種,我應該選擇哪一種,爲什麼?

回答

2

我會去第二個,除非foo()是非常性能的關鍵,因爲我認爲它更清晰。

作爲用於區別:

第一個將被編譯成不同版本的不同Number值。這可能允許編譯器根據如何使用num進行更多優化。

第二個版本只針對不同的T有不同版本,並且會在運行時選擇不同的num

第一個可能稍微快一點,但第二個會產生較少的代碼(這可能會更快取決於內存壓力)。

10

這真的取決於你想要做什麼。如果num值是一個模板參數,那麼它必須在編譯時指定。如果它是一個函數參數,那麼它可以在運行時指定。

你的用例是什麼?

4

這是一個代碼清潔問題,你會想知道的。假設用戶輸入該選項。所以你有一些變量Number x可能是OneTwo。如果你想打電話給foo(),你需要做的......

if (x == One) 
    foo<const char *, One>("asd"); 
else 
    foo<const char *, Two>("asd"); 

的地方,如果你使用的另一種方式(你的建議,二號),你可以簡單地做:

foo<const char *>("asd", x); 

現在,如果在這個功能中,將這些可能的分支優化出來是非常有益的,那麼肯定。但除此之外,我認爲你只是讓自己難過。


另外,關於這些方法如何不同。在我上面寫的代碼中,我引用了三個不同的函數。在最後一個只有一個模板參數的情況下,爲num == Onenum == Two時,爲該函數生成的代碼將包含兩個代碼路徑。然而,前兩種模板化方法將能夠移除這些分支。它可以這樣做,因爲它會在內存中構建兩個不同的代碼路徑,每個情況一個。

相關問題