6

我正在尝试解决匿名函数变得非常容易的问题,并且想知道这在 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 表达式的语法是什么?

4

3 回答 3

5

正如 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));
于 2010-04-05T18:35:07.943 回答
2

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

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

于 2010-04-05T18:23:30.020 回答
0

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

于 2010-04-05T18:24:14.853 回答