有时我会看到这样的语法。
template<typename T,typename = int>
int foo(){
//...
}
typename = int
是什么意思?它可以在哪里使用?
foo
有两个模板参数。第一个称为T
,第二个未命名,默认为int
。
在您的代码中,没有理由单独使用第二个参数。SFINAE中经常会出现未命名的模板参数。cppreference中的一个例子:
// 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>
和bar<std::string>
是两种不同的类型。
这很少被使用。。。
但这是typename的默认值,但这里不需要它,因为编译器本身可以自动重载函数,并为您传递的正确参数获取正确的类型!
它还为什么类型名称键入?这里没有道理!
它在使用嵌套模板时使用。。。
我在C++的原始参考中发现:
模板参数的模板参数列表可以他们自己的默认参数,只有在模板模板参数本身在范围内:
// class template, with a type template parameter with a default template<typename T = float> struct B {}; // template template parameter T has a parameter list, which // consists of one type template parameter with a default template<template<typename = float> typename T> struct A { void f(); void g(); }; // out-of-body member function template definitions template<template<typename TT> class T> void A<T>::f() { T<> t; // error: TT has no default in scope } template<template<typename TT = char> class T> void A<T>::g() { T<> t; // ok: t is T<char> }
这是链接