2015-09-04 87 views
1

不像模板參數,必須由模板的用戶指定用途,該功能模板參數是由編譯器推斷。因此,會產生一個自然的問題:爲什麼要指定默認函數模板參數?什麼是函數默認模板參數

我可以想到的一個用法是,當我們想強制一些函數模板參數而不需要指定它們全部。但是,這似乎是一個角落案例。還有其他情況嗎?

+2

「函數模板參數由編譯器推導出來」。 [或不](http://en.cppreference.com/w/cpp/memory/shared_ptr/make_shared)。 –

+0

當我發佈這個帖子的時候,我正處在寫回復的過程中:) – AlwaysLearning

回答

0

這可能是部分答案。我想到的一個用途是,當我們有一個模板參數不在函數的參數列表中顯示爲類型,因此無法推導出來。爲該模板參數提供默認參數可能非常合理。以上評論由n.m.提供了這種用法的一個很好的例子。

-1

實施例:

template <typename Y, typename Y, int Z> 
class Do{}; 

X,Y,Z是模板的參數。

用戶可以使用此類似:

Do<int,int,1> doit; 

在使用類模板也沒有辦法,模板參數得到從函數參數推斷。

你叫什麼「默認」的爭論......

template <typename Y, typename Y, int Z=9> 
class Do{}; 

這裏,如果沒有從使用這樣的代碼給定的Z默認爲9:

​​

如果你的模板參數可以從功能參數推導出用戶可能想要使用特殊模板實例,例如:

template <typename T> 
void func(const T&); 

    template<> 
void func(const int&) 
{ 
    std::cout << "int in use" << std::endl; 
} 

template<> 
void func(const double&) 
{ 
    std::cout << "double in use" << std::endl; 
} 

int main() 
{ 
    func(3.4); // calls double 
    func<int>(3.4); //calls int 
} 
+0

這個問題是關於** function **模板的。 – AlwaysLearning

+0

非常感謝!手動給定參數的例子正好與函數模板!並且將它用於類或函數模板在這裏是一樣的......無所謂!玩得開心:-) – Klaus

0

嘗試將func轉換爲constructor(它們不具有返回類型)。

template<class T> 
    typename std::enable_if< std::is_fundamental<T>::value >::type func(T p_arg){} 

    template<class T> 
    typename std::enable_if< !std::is_fundamental<T>::value >::type func(T const &p_arg){} 

使用默認函數模板參數很容易。

+0

這對我而言並不是很清楚你想要完成什麼。你能幫我跟上最後一句代碼嗎? – AlwaysLearning