首页 >后端开发 >C++ >'省略号”(...) 表示法在可变参数模板中如何工作以及它在打包和解包参数中的不同作用是什么?

'省略号”(...) 表示法在可变参数模板中如何工作以及它在打包和解包参数中的不同作用是什么?

Linda Hamilton
Linda Hamilton原创
2024-10-31 04:26:31617浏览

How does the

可变参数模板:揭开省略号的神秘面纱

C 11 中引入的可变参数模板,通过允许函数和类接受和处理可变数量的参数。然而,它们语法的某些方面可能会引起人们的好奇心。其中一个谜团就是神秘的“省略号”(...) 表示法,它引发了有关其目的和用法的问题。

在可变参数模板的上下文中,省略号 (...) 是一种关键工具对于打包解包参数和参数。它的作用由其在模板定义或调用中的相对位置决定。

解包:将参数扩展为参数

当放置在表达式右侧时,省略号充当解包器。它允许将模板参数扩展为一系列实际参数。例如,在以下函数模板中:

<code class="cpp">template<class T, class... Args>
unique_ptr<T> make_unique(Args&&... args) {
    return unique_ptr<T>(new T(std::forward<Args>(args)...));
}</code>

std::forward(args)... 中的省略号将 Args 模板参数解压到 args 函数参数列表中,从而可以构造带有提供的参数的新 unique_ptr。

打包:将参数组合成参数

相反,当放置在参数左侧时,省略号充当打包器。它将一系列参数打包到一个参数中。这种打包发生在模板参数推导和函数调用调用期间。

为了进行说明,请考虑以下函数调用:

<code class="cpp">make_unique<int>(1, 2, 3);</code>

make_unique(... ) 打包中的省略号将参数 1、2 和 3 放入单个参数包中,与 Args` 模板参数匹配。

示例模板函数 f 演示了打包和解包功能:

<code class="cpp">template <typename ...T>
void f(T ...args) {
    g(args...);  // Unpacking: Pattern = args
    h(x(args)...);  // Unpacking: Pattern = x(args)
    m(y(args...)...);  // Packing: Pattern = args (arg to y())
}</code>

当使用 T 作为 {int, char, Short} 调用 f 时,每个函数调用都会展开为:

<code class="cpp">g(arg0, arg1, arg2);           
h(x(arg0), x(arg1), x(arg2));
m(y(arg0, arg1, arg2));</code>

位置不一致

您可能会注意到省略号的位置明显不一致模板参数列表和函数参数列表之间。在模板参数中,它出现在参数包的中间,而在函数参数中,它出现在末尾。这种差异是因为在模板参数中,省略号是语法糖,代表参数包的解包,而在函数参数中,它是语法的一部分 定义打包参数的类型。

总而言之,可变参数模板中的省略号 (...) 在将参数扩展为参数以及将参数组合为参数方面发挥着关键作用,从而能够创建可以处理不同数量参数的灵活且可扩展的代码。

以上是'省略号”(...) 表示法在可变参数模板中如何工作以及它在打包和解包参数中的不同作用是什么?的详细内容。更多信息请关注PHP中文网其他相关文章!

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