其他分享
首页 > 其他分享> > Lambda表达式能否降级为C 98

Lambda表达式能否降级为C 98

作者:互联网

我最近遇到了一个问题,需要将用lambda表达式编写的C 11代码集成到仅支持C 98编译器的旧代码库中.我想出了lambda的两个等效项,例如Macro,函子或函数指针.但是当用捕获翻译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的每个逻辑仍然可以重用?还是我必须在每个此类调用方上重新编写逻辑?

解决方法:

使用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

标签:c98,c,c11,lambda
来源: https://codeday.me/bug/20191012/1897651.html