可以将Lambda表达式降级为C ++ 98

时间:2015-11-03 18:32:55

标签: c++ c++11 lambda c++98

我最近遇到了一个问题,需要将用lambda表达式编写的C ++ 11代码集成到只支持C ++ 98编译器的旧代码库中。我想出了几个可能等效的lambda,如Macro,functor或函数指针。但是在用捕获法翻译lambda时,它们似乎都是有限的。例如,带回调的简单通用函数:

template <class Fn>  
void ForEachObject(Fn fn)  
{  
    for (uint i = 0; i < objectCount; i++)  
    {  
        fn(i, address + i * objectSize);  
    }  
}

,典型的来电者会做类似的事情:

uint attributes = 0x0030;
....
ForEachObject([=](uint index, void * objectAddress)
{
    if ((ObjectInfo(index) & attributes) != 0)
    {
        fn(index, objectAddress);
    }
});

注意这里的属性来自lambda的范围。无论如何仍然重用没有lambda的每个逻辑?或者我必须在每个这样的呼叫者上重写逻辑?

2 个答案:

答案 0 :(得分:6)

使用Functor:

struct Functor
{
    explicit Functor(uint attributes) : attributes(attributes) {}
    void operator () (uint index, void * objectAddress) const
    {
        if ((ObjectInfo(index) & attributes) != 0)
        {
            fn(index, objectAddress);
        }
    }
    uint attributes;
};

然后致电

uint attributes = 0x0030;
// ....
ForEachObject(Functor(attributes));

对于每个不同的lambda,你必须编写一个仿函数。 您不必修改ForEachObject

答案 1 :(得分:2)

  

可以将Lamda表达式降级为C ++ 98

不,他们不能。以前的C ++ 11标准没有lambda语法的概念。

虽然有像boost::lambda

这样的代理人

您可以提供仿函数样式类,覆盖调用运算符(<return_type> operator()(<args>);),以提供相同的效果,如其他答案中所述。