此模板语法"typename = T"是什么意思?



有时我会看到这样的语法。

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>
}

这是链接