首页 >后端开发 >C++ >C 17 模板推导指南如何改进模板参数推导?

C 17 模板推导指南如何改进模板参数推导?

Linda Hamilton
Linda Hamilton原创
2024-12-10 22:45:12393浏览

How Do C  17 Template Deduction Guides Improve Template Argument Deduction?

模板推导指南:全面讲解

简介

C 17 引入了一个强大的功能,称为“模板推导指南”, “这在增强构造函数的模板参数推导方面发挥着关键作用。此功能解决了使用模板构造对象时推断适当模板参数的挑战。

什么是模板推导指南?

模板推导指南是与模板关联的模式班级。它们指导编译器将传递给构造函数的参数转换为相应的模板参数。本质上,它们为编译器建立了规则,以根据构造函数的参数确定要实例化的模板专门化。

为什么以及何时使用模板推导指南

模板推导指南当无法直接从构造函数参数的类型推断模板参数时,这是必需的。当模板参数不是从单个参数的类型派生时,就会出现这种情况。例如,考虑 std::vector 的构造函数采用迭代器对的情况:

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

在此示例中,无法从迭代器参数直接推断出向量的 T 模板参数的类型。必须使用推导指南来通知编译器正确的特化应该是 vector::value_type>.

声明模板推导指南

模板推导指南使用以下方式声明语法:

template class_name(constructor_args) -> template_args;
  • 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::value_type.

聚合初始化和模板推导指南

有趣的是,模板推导指南也可以与聚合和聚合一起使用初始化:

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn