没有C ++ 0x的C ++ lambda函数?

时间:2014-08-29 08:10:58

标签: c++ boost lambda

我有一个C ++ 11 lambda函数,它需要在没有C ++ 0x的情况下实现。到目前为止,我尝试使用boost.lambda但没有成功。

lambda函数捕获4个变量并将2作为参数。在lambda函数的主体中有几个if / else,case和大约100行代码。

  • 这是否可以通过boost.lambda /如何实现?
  • 如果你能指出一个图书馆/举例,会很高兴。

希望我写下你需要的所有信息。

€: 我把它运行了,谢谢。一点跟进问题:

  • 还有一种方法可以给Obj.operater()();另一个函数作为回调函数/函数指针?

我的第一次尝试是这样的:

    Lambda Obj( C, D);
    command ( Obj.operator()(typeA A, typeB B));

由于

3 个答案:

答案 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)

Live demo link:

#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);
}