bin*_*377 2 c++ lambda c++11 c++98
我最近遇到了一个问题,需要将用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);
}
}
Run Code Online (Sandbox Code Playgroud)
而典型的来电者会做类似的事情:
uint attributes = 0x0030;
....
ForEachObject([=](uint index, void * objectAddress)
{
if ((ObjectInfo(index) & attributes) != 0)
{
fn(index, objectAddress);
}
});
Run Code Online (Sandbox Code Playgroud)
这里的注意属性来自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;
};
Run Code Online (Sandbox Code Playgroud)
然后打电话
uint attributes = 0x0030;
// ....
ForEachObject(Functor(attributes));
Run Code Online (Sandbox Code Playgroud)
对于每个不同的lambda,你必须编写一个仿函数.您不必修改ForEachObject
| 归档时间: |
|
| 查看次数: |
1503 次 |
| 最近记录: |