有时我会看到这样的语法。
template<typename T,typename = int>
int foo(){
//...
}
哪一部分typename = int
意思是?
可以用在哪里?
foo
有两个模板参数。第一个叫做T
第二个未命名,默认为int
.
仅在您的代码段中,没有理由使用第二个参数。未命名的模板参数通常会出现在 SFINAE 中。一个例子来自参考参数 https://en.cppreference.com/w/cpp/language/sfinae:
// primary template handles non-referenceable types:
template<class T, class = void>
struct reference_traits {
using add_lref = T;
using add_rref = T;
};
// specialization recognizes referenceable types:
template<class T>
struct reference_traits<T, std::void_t<T&>> {
using add_lref = T&;
using add_rref = T&&;
};
template<class T>
using add_lvalue_reference_t = typename reference_traits<T>::add_lref;
template<class T>
using add_rvalue_reference_t = typename reference_traits<T>::add_rref;
主模板有第二个参数的唯一原因是它可以被专门化。如果可能的话,会实例化更专业的专业化。如果失败(因为T&
无效),然后“替换失败不是错误”(SFINAE)开始,并且主模板被实例化。
未命名参数的一个更简单的示例是当您希望模板参数仅作为标记来区分不同的实例化时:
template<typename = int>
struct bar {
// ...
};
即使实施bar
不依赖于您可能想要的模板参数bar<double>
and bar<std::string>
是两种不同的类型。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)