Lambda表达式可以降级到C++ 98吗

Can Lambda expression be downgraded to C++ 98

我最近遇到一个问题,需要将使用 lambda 表达式编写的 C++ 11 代码集成到仅支持 C++ 98 编译器的旧代码库中。我想出了几个可能的 lambda 等价物,比如宏、函子或函数指针。但是在用捕获翻译 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 的情况下重用每个逻辑?或者我必须为每个这样的调用者重写逻辑?

与函子:

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

Can Lamda expression be downgrade to C++ 98

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

虽然有像 boost::lambda

这样的替代品

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