微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C 17中的模板扣除指南是什么?

C 17上的各种项目都提到“模板扣除指南”.我收集他们与C 17中介绍的构造函数新模板扣除有关,但我还没有看到一个简单的,常见问题解答的解释,它们是什么,它们是什么.

> C 17中的模板扣除指南是什么?
为什么(和什么时候)我们需要它们?
>如何申报?

解决方法

模板扣除指南是与模板类相关联的模式,可以告诉编译器如何将一组参数(及其类型)转换为模板参数.

最简单的例子是std :: vector及其构造函数,它采用迭代器对.

template<typename Iterator>
void func(Iterator first,Iterator last)
{
  vector v(first,last);
}

编译器需要确定什么向量T的T类型将是.我们知道答案是什么; T应该是typename std :: iterator_traits< Iterator> :: value_type.但是我们如何告诉编译器,而不用输入vector< typename std :: iterator_traits< Iterator> :: value_type>?

您使用扣除指南:

template<typename Iterator> vector(Iterator b,Iterator e) -> vector<typename std::iterator_traits<Iterator>::value_type>;

这告诉编译器,当您调用与该模式匹配的向量构造函数时,它将使用 – >右侧的代码推导出向量专门化.

当从参数中扣除类型不是基于其中一个参数的类型时,需要指导.从initializer_list初始化一个向量,显式地使用向量的T,因此它不需要指南.

左侧不一定指定构造函数.它的工作原理是,如果您在类型上使用模板构造函数扣除,它将匹配所有扣除指南(实际构造函数提供隐式指南)的参数.如果有匹配,它将使用它来确定要提供给类型的模板参数.但是重载分辨率确定哪个构造函数调用发生之后.

这也意味着您可以使用聚合和聚合初始化的指南:

template<typename T>
struct Thingy
{
  T t;
};

Thingy(const char *) -> Thingy<std::string>;

Thingy thing{"A String"}; //thing.t is a `std::string`.

因此,扣除指南仅用于计算初始化的类型.初始化的实际过程与之前的工作完全一样,一旦做出了确定.

原文地址:https://www.jb51.cc/c/111332.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐