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