简介
C 17 引入了一个强大的功能,称为“模板推导指南”, “这在增强构造函数的模板参数推导方面发挥着关键作用。此功能解决了使用模板构造对象时推断适当模板参数的挑战。
什么是模板推导指南?
模板推导指南是与模板关联的模式班级。它们指导编译器将传递给构造函数的参数转换为相应的模板参数。本质上,它们为编译器建立了规则,以根据构造函数的参数确定要实例化的模板专门化。
为什么以及何时使用模板推导指南
模板推导指南当无法直接从构造函数参数的类型推断模板参数时,这是必需的。当模板参数不是从单个参数的类型派生时,就会出现这种情况。例如,考虑 std::vector 的构造函数采用迭代器对的情况:
template<typename Iterator> void func(Iterator first, Iterator last) { vector v(first, last); }
在此示例中,无法从迭代器参数直接推断出向量的 T 模板参数的类型。必须使用推导指南来通知编译器正确的特化应该是 vector
声明模板推导指南
模板推导指南使用以下方式声明语法:
template class_name(constructor_args) -> template_args;
示例
考虑 std::vector 的推导指南的示例:
template<typename Iterator> vector(Iterator b, Iterator e) -> vector<typename std::iterator_traits<Iterator>::value_type>;
该指南指示编译器当使用(迭代器对)构造函数模式构造 std::vector 时,应该推导模板参数 T as typename std::iterator_traits
聚合初始化和模板推导指南
有趣的是,模板推导指南也可以与聚合和聚合一起使用初始化:
template<typename T> struct Thingy { T t; }; Thingy(const char *) -> Thingy<std::string>; Thingy thing{"A String"}; //thing.t is a `std::string`.
在这个例子中,一个模板推导指南用于根据传递给聚合构造函数的字符串文字的类型推导 Thingy 的模板参数 T。
结论
模板推导指南是构建模板化对象时启用类型推断的强大工具。通过显式定义如何将构造函数参数转换为模板参数,程序员可以显着简化模板实例化的过程并提高代码可读性。
以上是C 17 模板推导指南如何改进模板参数推导?的详细内容。更多信息请关注PHP中文网其他相关文章!