参数列表中带有省略号的 C++ Lambda

标签 c++ lambda c++14 variadic-functions generic-lambda

我正在开发一个使用 lambda 来描述表达式术语范围的库。因为库必须分发唯一的整数来标识每个变量,所以理想的情况是库而不是用户构造变量并且用户代码将它们作为 lambda 参数接收。

(换句话说,我正在从 miniKanren 实现“call\fresh”的 C++ 模拟。)

由于用户可能想在特定范围内引入从零到许多新变量的任何数字,我希望用户能够将具有不同数量参数的 lambda 传递给库。但是,我不知道有任何(简单的)方法(在 C++14 中)可以推断出任意 lambda 对象的参数数量。

我突然想到为什么不将固定数量(比如 10 个)的变量 ID 参数传递给 lambda,并让用户代码在 lambda 中使用省略号来忽略不需要的参数?像这样:

auto no_args = call_fresh([](...) { return success(); });
auto one_arg = call_fresh([](var A, ...) { return A == 1; });
auto two_args = call_fresh([](var A, var B, ...) { return A == 1 && B == 2; });

编译器资源管理器似乎接受 lambda 参数列表中的省略号,至少对于 gcc 是这样。

它会被称为这样的东西(请注意代码总是传递 10 个变量 id,无论“f”只命名一个、两个还是一个都不命名):

template <typename F>
auto call_fresh(F f)
{
   return [f](StateCounter sc) {
      return f(sc+0,sc+1,sc+2,sc+3,sc+4,
          sc+5,sc+6,sc+7,sc+8,sc+9);
   };
}

虽然这是一个让我感到惊讶的功能,但有什么理由不使用带有省略号的 lambda 吗?

最佳答案

However, I'm not aware of any (simple) way (in C++14) to deduce the number of parameters to an arbitrary lambda object.

在我看来,您正在通过可变参数 auto 列表寻找 sizeof...()

#include <iostream>

int main ()
 {
   auto l = [](auto ... as) { return sizeof...(as); };

   std::cout << l(1, 2L, 3.0, 4.0f, "5") << std::endl; // print 5
 }

关于参数列表中带有省略号的 C++ Lambda,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50280754/

相关文章:

c++ - lambda表达式移动捕获的时机

c++ - Boost Lambda/Phoenix - 如何做返回另一个 lambda 的 lambda?

python - 在 try-except block 中关闭游标后如何关闭连接?

c++ - 在自动化测试后安全清理阻塞的 std::thread

c++14可变参数模板问题 'is ambiguous'

java - "Simulating"一个 64 位整数和两个 32 位整数

c++ - 错误代码Visual Studio错误:c2059 strange syntax error

c++ - 隐藏窗口边框,如果我知道这个窗口的句柄

python - 带有外部库 psycopg2 的 lambda python 函数 - 没有名为 psycopg2 的模块