我有一个C ++ 11 lambda函数,它需要在没有C ++ 0x的情况下实现。到目前为止,我尝试使用boost.lambda但没有成功。
lambda函数捕获4个变量并将2作为参数。在lambda函数的主体中有几个if / else,case和大约100行代码。
希望我写下你需要的所有信息。
€: 我把它运行了,谢谢。一点跟进问题:
我的第一次尝试是这样的:
Lambda Obj( C, D);
command ( Obj.operator()(typeA A, typeB B));
由于
答案 0 :(得分:6)
这不是Boost.Lambda的设计目标。最好的办法是将其转换为普通的功能对象。
简单地转换一下:
[a, &b, c, &d](args) -> ReturnValue { body; }
进入这个:
class Lambda
{
Type_of_a a;
Type_of_b &b;
Type_of_c c;
Type_of_d &d;
public:
Lambda(Type_of_a a, Type_of_b &b, Type_of_c c, Type_of_d &d) : a(a), b(b), c(c), d(d) {}
ReturnValue operator() (args) const
{ body; }
};
创建一个Lambda
类的实例,在其中创建原始的lambda表达式。
您可以将Lambda
的定义放在未命名的命名空间中,以模拟lambda的未命名类型。
答案 1 :(得分:3)
如果您坚持使用C ++ 03 / C ++ 98,那么最好创建一个仿函数,而不是试图让Boost.Lambda使用您的100行代码。无论如何,C ++ 11 lambda主要是用于创建仿函数的语法糖。
您可以轻松翻译以下lambda:
const auto lambda = [c1, c2, c3, c4](A1 a1, A2 a2) -> RetVal { /*somecode*/ };
进入以下仿函数:
namespace
{
struct Functor
{
Cap1 c1; Cap2 c2; Cap3 c3; Cap4 c4;
Functor(Cap1 c1, Cap2 c2, Cap3 c3, Cap4 c4)
: c1(c1), c2(c2), c3(c3), c4(c4) {}
RetVal operator()(A1 a1, A2 a2) const
{
/*somecode*/
}
};
}
答案 2 :(得分:0)
#include <iostream>
#include <functional>
template <typename Arg1, typename Arg2, typename Cap1, typename Cap2>
struct my_lambda : std::binary_function<Arg1, Arg2, void>
{
my_lambda(const Cap1& c1, const Cap2& c2) : cap1(c1), cap2(c2) {}
void operator()(const Arg1& arg1, const Arg2& arg2) const
{
// lambda body
std::cout << (cap1 + cap2 + arg1 + arg2) << std::endl;
}
mutable Cap1 cap1;
mutable Cap2 cap2;
};
template <typename Arg1, typename Arg2, typename Cap1, typename Cap2>
my_lambda<Arg1, Arg2, Cap1, Cap2> lambda(const Cap1& c1, const Cap2& c2)
{
return my_lambda<Arg1, Arg2, Cap1, Cap2>(c1, c2);
}
int main()
{
int i = 1, j = 2;
lambda<int, int>(i, j)(3, 4);
// same as:
// [i, j] (int a, int b)
// {
// std::cout << (i + j + a + b) << std::endl;
// } (3, 4);
}