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

Ste*_*eve 6 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*/)
}
Run Code Online (Sandbox Code Playgroud)

对于我必须做的事情,这个例子非常非常简单.在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*/)
}
Run Code Online (Sandbox Code Playgroud)

这里我的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*/)
}
Run Code Online (Sandbox Code Playgroud)

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

Éri*_*ant 5

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

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

DoSomething(1, _1 * 5);
Run Code Online (Sandbox Code Playgroud)

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

DoSomething(1, bind(&NumHolder::x, _1) * 5);
Run Code Online (Sandbox Code Playgroud)

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

DoSomething(1, &_1->* &NumHolder::x * 5);
Run Code Online (Sandbox Code Playgroud)

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

假设ChangeVal采用int并且您希望匿名函数执行相同的操作ChangeVal(the_arg.x),那么您可以使用Boost.Lambda编写它:

DoSomething(1, bind(&ChangeVal, &_1->*&NumHolder::x));
Run Code Online (Sandbox Code Playgroud)

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

DoSomething(1, bind(&ChangeVal, bind(&NumHolder::x, _1));
Run Code Online (Sandbox Code Playgroud)