gpt4 book ai didi

c++ - 这个模板语法 "typename = T"是什么意思?

转载 作者:行者123 更新时间:2023-12-05 09:35:54 25 4
gpt4 key购买 nike

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

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>是两种不同的类型。

关于c++ - 这个模板语法 "typename = T"是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65491395/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com