首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >参数列表中带有椭圆的C++ Lambdas

参数列表中带有椭圆的C++ Lambdas
EN

Stack Overflow用户
提问于 2018-05-10 20:05:56
回答 1查看 1.7K关注 0票数 6

我正在开发一个库,它使用lambdas来描述表达式的范围。因为库必须发出唯一的整数来标识每个变量,所以如果库(而不是用户)构造变量,并且用户代码以lambda参数的形式接收变量,这是非常理想的。

(换句话说,我正在实现来自miniKanren的“调用\新鲜”的miniKanren模拟。)

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

我想到了一个想法,为什么不将一个固定的变量id参数(例如,10)传递给lambda,让用户代码使用lambda中的省略号来忽略那些不需要的变量呢?就像这样:

代码语言:javascript
复制
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“是只命名一个、两个还是没有一个变量):

代码语言:javascript
复制
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);
   };
}

虽然这是一个我很惊讶的特性,但有什么理由不使用带有省略号的lambdas呢?

EN

回答 1

Stack Overflow用户

发布于 2018-05-10 20:22:10

但是,我不知道有任何(简单的)方法(在C++14中)可以推断任意lambda对象的参数数。

在我看来,你是在寻找sizeof...(),而不是各种auto的参数列表

代码语言:javascript
复制
#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
 }
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50280754

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档