I recently got a problem need to integrate C++ 11 code written with lambda expression to old code base which only support C++ 98 compiler. I figured out couple of possible equivalences of lambda like Macro, functor or function pointer. But seems they are all limited when translating lambda with capture. For example a simple generic function with call back:
template <class Fn>
void ForEachObject(Fn fn)
{
for (uint i = 0; i < objectCount; i++)
{
fn(i, address + i * objectSize);
}
}
and the typical caller will do something like:
uint attributes = 0x0030;
....
ForEachObject([=](uint index, void * objectAddress)
{
if ((ObjectInfo(index) & attributes) != 0)
{
fn(index, objectAddress);
}
});
Note attributes here is come from out of the scope of lambda. Is there anyway to still reuse the for each logic without lambda? Or I must re-write the logic on every such caller?
With 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;
};
And then call
uint attributes = 0x0030;
// ....
ForEachObject(Functor(attributes));
For each different lambda, you have to write a functor.
You don't have to modify ForEachObject
Can Lamda expression be downgrade to C++ 98
No they cannot. Prior C++11 standards have no notion of lambda syntax.
Though there are surrogates available like boost::lambda
You can provide functor style classes, overriding the call operator (<return_type> operator()(<args>);
), to provide the same effect, as mentioned in the other answer.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With