2014-08-29 38 views
1

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

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

  • 这是甚至可能与boost.lambda /这怎么能实现?
  • 如果你能指出一个图书馆/举一个例子,会很高兴。

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

€: 我明白了,谢谢。稍后续问题:

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

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

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

感谢

+2

使用谓词。我不认为C++ 0x中的lambda表达式有100行以上的代码。 – 2014-08-29 08:14:03

+2

SURELY如果你的lambda函数是100行,它并不打算成为一个lambda函数呢?当它们适合一两行时,Lambda非常棒,但除此之外,您需要可用于设置断点的真实函数等。 – 2014-08-29 08:16:01

+3

编写您自己的函数结构只需~15行开销 – 2014-08-29 08:16:06

回答

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的未命名类型。

3

如果您遇到C++ 03/C++ 98,最好使用创建函数而不是试图使Boost.Lambda与100行代码一起工作。无论如何,C++ 11 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*/ 
    } 
    }; 
} 
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); 
}