我正在尝试解决匿名函数使问题变得非常非常容易的问题,并且想知道这在 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/