gpt4 book ai didi

c++ - 什么是模板扣除指南,我们应该在什么时候使用它们?

转载 作者:IT老高 更新时间:2023-10-28 12:06:12 25 4
gpt4 key购买 nike

C++17 标准引入了“模板推导指南”。我认为它们与此版本标准中引入的构造函数的新模板参数推导有关,但我还没有看到简单的常见问题解答式解释它们是什么以及它们的用途。

  • 什么是 C++17 中的模板推导指南?

  • 我们为什么(以及何时)需要它们?

  • 如何声明它们?

最佳答案

模板推导指南是与模板类关联的模式,它告诉编译器如何将一组构造函数参数(及其类型)转换为类的模板参数。

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

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

编译器需要弄清楚 vector<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>;

这告诉编译器,当你调用 vector与该模式匹配的构造函数,它将推导出 vector使用 -> 右侧的代码进行特化.

当从参数中推断类型不是基于这些参数之一的类型时,您需要指南。初始化 vector来自 initializer_list明确使用 vectorT ,所以不需要向导。

左边不一定指定一个实际的构造函数。它的工作方式是,如果您对一个类型使用模板构造函数推导,它会匹配您针对所有推导指南传递的参数(主模板的实际构造函数提供隐式指南)。如果有匹配,它会使用它来确定要提供给类型的模板参数。

但是,一旦推导完成,一旦编译器计算出该类型的模板参数,该类型对象的初始化就会继续进行,就好像这一切都没有发生一样。即选择的推导指南不必与选择的构造函数相匹配。

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

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

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

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

所以推导指南仅用于确定正在初始化的类型。一旦做出决定,初始化的实际过程就和以前完全一样。

关于c++ - 什么是模板扣除指南,我们应该在什么时候使用它们?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40951697/

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