我最近遇到一个问题,需要将使用 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/