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

标签 c++ c++11 lambda 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

关于c++ - Lambda表达式可以降级到C++ 98吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33506531/

相关文章:

c++ - C++模板中的多步推理器

C++ - 使用 Eigen 构建时找不到符号

c++ - C++中的前向声明

c++ - 两边都有省略号的 Lambda 包捕获 - 是什么意思?

Java 调试接口(interface)、Lambda 和行号

c++ - 相对标题 XCode 4

R : C++11 standard requested but CXX11 is not defined

c++ - 意外警告 : inline function used but never defined

c++ - 执行中断信号时服务器停止操作的最佳方法是什么?

python - 对对象列表进行排序,TypeError : unorderable types