功能参数包

Function parameter pack

本文关键字:参数 功能      更新时间:2023-10-16

我最近在工作草案中看到了以下代码摘录,编程语言C 的标准(日期为2016-05-30,第96页)。

auto vglambda = [](auto printer) {
    return [=](auto&& ... ts) { // OK: ts is a function parameter pack
        printer(std::forward<decltype(ts)>(ts)...);
        return [=]() {
            printer(ts ...);
        };
    };
};

我在这里无法理解椭圆。从" C"意义上讲,它们不是旧的椭圆形,因为它们正在扩大。从"模板参数包"的意义上讲,它们不是参数包,因为没有可见的模板。在评论中,它将其称为功能参数包。

我研究了是否可以使用参数包定义常规功能。

void f(auto&& ...ts) {} // error

没有编译但

auto k = [](auto&& ...ts){};

编译良好,我可以按预期称为

k(1, 2, 3);

在我看来,这只是一个变相的模板参数包,因为lambdas是伪装的函子。因此,只有lambda表达方式才有可能。

我将感谢澄清和/或阐明。

auto lambdas其中添加了C 14。

这允许您使用template operator()创建lambdas。

您用

做到这一点
[](auto x){}
[](auto...xs){}
[](auto& xs){}
[](auto&...xs){}
[](auto&& xs){}
[](auto&&...xs){}
[](auto const& xs){}
[](auto const&...xs){}

语法。请注意,可以添加非模板参数(以上不是令人震惊的)。这些对应于auto映射到隐式模板类型参数。

有一些关于将其扩展到概念建议中的正常功能的讨论,该概念提交了C 14,C 17,现在可以在C 20中进行TS。