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表达式的语法是什么?
正如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)
归档时间: |
|
查看次数: |
2303 次 |
最近记录: |