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

时间:2010-04-05 18:17:55

标签: c++ boost anonymous-function

我正在尝试解决匿名函数变得更容易,更容易的问题,并且想知道这是否可以在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 =&gt; 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 =&gt;行。 p.temp * 5.使用boost可以在C ++中做到吗?

编辑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 =&gt; ChangeVal(P)。 C ++ lambda表达式的语法是什么?

3 个答案:

答案 0 :(得分:5)

正如Anders在他的回答中指出的那样,boost :: lambda可能很有用,但在某些情况下代码可能变得难以阅读。因此,这取决于你在匿名函数中想要做什么。

对于你在问题中提到的p => p * 5之类的简单案例,在我看来,使用Lambda或Bind是合理的,但是:

DoSomething(1, _1 * 5);

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

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

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

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));

答案 1 :(得分:2)

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

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

答案 2 :(得分:0)

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