c++ - 可以使用带有 boost 的 C++ 匿名函数吗?

标签 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 => 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 表达式的语法是什么?

最佳答案

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

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

DoSomething(1, _1 * 5);

编辑: 您的第二个示例击中了语法很快变得冗长的一个区域:成员(数据或函数)访问。因为“点”运算符不能在 C++ 中重载,所以必须使用绑定(bind)表达式从参数中获取“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));

关于c++ - 可以使用带有 boost 的 C++ 匿名函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2580123/

相关文章:

c# - 来自封闭 block 的变量在匿名函数中变为空

c++ - 我怎样才能以一种简单易行的方式定义这个值?

c++ - 在源代码中使用环境变量(编译时)

c++ - 运行期间传递的参数的平方根

c++ - 使用 boost python 将 python 列表传递给 c++ 扩展

Javascript:两个自执行函数如何相互访问

javascript - JS如何控制匿名函数

c++ - 为 Mac OS X 修改旧的 Windows 程序

c++ - 重用 Boost 的计时器对象

c++ - boost::apply_visitor 不是 [some] 类的成员