我最近遇到一个问题,需要将用 lambda 表达式编写的 C++ 11 代码集成到仅支持 C++ 98 编译器的旧代码库。我发现了 lambda 的几个可能的等价物,例如宏、函子或函数指针。但在用 capture 翻译 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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)