Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Can Lambda expression be downgraded to C++ 98

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?

like image 211
bin3377 Avatar asked Jan 08 '23 06:01

bin3377


2 Answers

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

like image 167
Jarod42 Avatar answered Jan 18 '23 01:01

Jarod42


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.

like image 36
πάντα ῥεῖ Avatar answered Jan 18 '23 01:01

πάντα ῥεῖ