2010-07-21 101 views
4

是否可以在C++中爲模板函數的變量定義默認值?C++模板函數默認值

類似下面:

template<class T> T sum(T a, T b, T c=????) 
{ 
    return a + b + c; 
} 

回答

8

試試這個:

template<class T> T sum(T a, T b, T c=T()) 
{ 
    return a + b + c; 
} 

你也可以把在T(5)如果你期待一個完整的類型,並希望默認值爲5.

0

是的!

但是你至少應該知道T可能是什麼或者它是無用的。

你不能設置爲功能模板參數的默認值,即該禁止:

template<typename T=int> void f(T a, T b); 
1

是的,那裏只需要一個T的構造函數,無論你放在那裏的任何值。鑑於你展示的代碼,我假設你可能希望這個參數是0。如果您需要構造函數的多個參數,則可以將T(arg1, arg2, arg3)設置爲默認值。

5

這一切都取決於您可以對類型進行的假設。

template <typename T> T sum(T a, T b, T c = T()) { return a+b+c; } 
template <typename T> T sum2(T a, T b, T c = T(5)) { return a+b+c; } 

第一種情況,它只假定T是默認可構造的。對於價值初始化(IIRC)且基本上爲0的POD類型,因此sum(5, 7)將呼叫sum(5, 7, 0)

在第二種情況下,您需要可以從整數構造類型。對於整數類型,sum(5, 7)將調用sum(5, 7, int(5)),相當於sum(5, 7, 5)

+2

默認參數僅在使用它們時才被實例化。這意味着可以將任何瘋狂的東西放入它們中,根本不會與'T'兼容,只要通過明確的論證就沒有問題。 – 2010-07-21 18:19:59

2

是的,你可以定義一個默認值。

template <class T> 
T constructThird() 
{ 
    return T(1); 
} 

template <class T> 
T test(T a, 
     T b, 
     T c = constructThird<T>()) 
{ 
    return a + b + c; 
} 

不幸的是constructThird不能把a和b作爲參數。