这个模板语法“typename = T”是什么意思?

Kem*_*kov 3 c++ syntax templates

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

template<typename T,typename = int>
int foo(){
    //...
}
Run Code Online (Sandbox Code Playgroud)

是什么typename = int意思?可以用在哪里?

for*_*818 5

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;
Run Code Online (Sandbox Code Playgroud)

主模板有第二个参数的唯一原因是它可以被专门化。如果可能的话,会实例化更专业的专业化。如果此操作失败(因为T&无效),则“替换失败不是错误”(SFINAE) 就会启动,并实例化主模板。


未命名参数的一个更简单的示例是当您希望模板参数仅作为标记来区分不同的实例化时:

template<typename = int>
struct bar {
    // ...
};
Run Code Online (Sandbox Code Playgroud)

即使 的实现bar不依赖于模板参数,您可能希望拥有bar<double>bar<std::string>成为两种不同的类型。