我想创建一个模板函数,它既包含类型模板参数,也可以从传递给函数的参数推导出来,以及非显式放置的非类型模板参数。似乎编译器可以推断每种类型是什么,但是如果我指定非类型模板参数,它需要所有模板参数。我可以只指定非类型模板参数,还是全部或全无?
#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;
}