繁体   English   中英

可以通过boost获得C ++匿名函数吗?

[英]Possible to have C++ anonymous functions with boost?

我正在尝试解决匿名函数变得更容易,更容易的问题,并且想知道这是否可以在c ++中实现。

我想做的是(基本上)

template<typename T>
T DoSomething(T one, function<T(T)> dosomething)
{
    return one + dosomething(5);
}

void GetMyVal(...)
{
   DoSomething<int>(1, /*anonymous func here*/)
}

对于我必须做的事情,这个例子非常非常简单。 在C#中我会做p => p * 5。 我知道这很容易用C ++ 0x,但我不能用它。 我觉得我应该能够使用boost :: lambda,或使用占位符的boost :: bind和boost :: function的组合,但我似乎无法让它工作。 这可能是不可能的,这也很好,但如果不可能请回答。 谢谢。

编辑:好吧,似乎int的简单情况工作正常,一个更复杂的结构怎么样? 所以,试试吧

struct NumHolder
{
  int x;
}

template<typename T>
T DoSomething(T one, function<T(NumHolder)> dosomething)
{
    NumHolder temp;
    temp = 5
    return one + dosomething(temp);
}

void GetMyVal(...)
{
   DoSomething<int>(1, /*anonymous func here*/)
}

这里我的C#表达式将与p => p.temp * 5一致。这是否可以在C ++中使用boost进行?

编辑2:好的,现在我只是好奇:D如何调用lambda表达式中的函数? 所以,如果我们有

int ChangeVal(int mult)
{
    return mult*5;
}

struct NumHolder
{
  int x;
}

template<typename T>
T DoSomething(T one, function<T(NumHolder)> dosomething)
{
    NumHolder temp;
    temp = 5
    return one + dosomething(temp);
}

void GetMyVal(...)
{
   DoSomething<int>(1, /*anonymous func here*/)
}

在C#中,我可以调用p => ChangeVal(p)。 C ++ lambda表达式的语法是什么?

正如Anders在他的回答中指出的那样,boost :: lambda可能很有用,但在某些情况下代码可能变得难以阅读。 因此,它取决于您在匿名函数中要执行的操作。

对于你在问题中提到的p => p * 5这样的简单情况,在我看来,使用Lambda或Bind是合理的,但是:

DoSomething(1, _1 * 5);

编辑:您的第二个示例命中一个语法快速详细的区域:成员(数据或函数)访问。 因为“点”运算符不能在C ++中重载,所以必须使用绑定表达式从参数中获取“x”:

DoSomething(1, bind(&NumHolder::x, _1) * 5);

或者,使用Boost.Lambda,使用重载 - > *运算符:

DoSomething(1, &_1->* &NumHolder::x * 5);

编辑2:好的,最后一次:)在你的上一个问题中,你用C#编写,你会写p => ChangeVal(p) ,但上面的代码显示一个ChangeVal采用int,而不是NumHolder,所以它是不清楚你的意思。

假设ChangeVal接受一个int并且您希望匿名函数执行相当于ChangeVal(the_arg.x) ,那么您可以使用Boost.Lambda编写它:

DoSomething(1, bind(&ChangeVal, &_1->*&NumHolder::x));

或者使用Boost.Bind(也适用于Lambda):

DoSomething(1, bind(&ChangeVal, bind(&NumHolder::x, _1));

不,不可能以简单的方式做到。 boost :: lambda可以提供帮助,但在我看来,使用它时代码很难阅读,所以我会避免使用它。

我认为相当于C# p=>p*5将是_1*5 ,但我只是简单地看了它,所以我不确定。 对于简单的东西,它可以工作,但是一旦你需要控制结构,你将不得不使用另一组控制结构,这些控制结构是基于功能的,而不是命令式的。 我发现这与普通的C ++代码有很大不同,我自己决定不值得使用它,因为它使得代码很难为其他人阅读。

boost不会扩展c ++的语法。 c ++中没有匿名函数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM