2016-11-29 25 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