2016-11-29 54 views
1

我想創建一個模板函數,該函數既具有可從傳遞給該函數的參數中推導出的類型模板參數,也具有非類型模板參數將被明確地放置。似乎編譯器可以推導出每種類型,但是如果我指定了非類型模板參數,它需要所有模板參數。我可以只指定非類型的模板參數,還是全部或全部處理?具有非類型參數的調用模板函數explicit和類型參數隱式

#include <iostream> 
#include <typeinfo> 

template <typename T, bool bPrint=true> 
void f(T var) { 
    if (bPrint) 
    std::cout << typeid(var).name() << std::endl; 
} 

int main() { 
    f(3); //works 
    f<false>(3); //error: template argument deduction/substitution failed 
} 
+0

模板參數必須傳遞給在完全相同的順序模板中聲明,而實例... –

回答

3

你可以但推導出的模板參數需要在參數列表的末尾。您可以通過重新排序的函數模板的參數讓你的代碼編譯:

template < bool bPrint=true, typename T> 
void f(T var) { 
    if (bPrint) 
    std::cout << typeid(var).name() << std::endl; 
} 

demo