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

Can Lambda expression be downgraded to C++ 98

本文关键字:C++98 降级 表达式 Lambda      更新时间:2023-10-16

我最近遇到了一个问题,需要将用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的情况下重用for each逻辑?或者我必须重写每一个这样的调用者的逻辑?

带函数:

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

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

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

尽管有类似boost::lambda 的替代品可用

您可以提供函子样式的类,覆盖调用运算符(<return_type> operator()(<args>);),以提供与另一个答案中提到的效果相同的效果。