Это разумный образец для повторного использования лямбда-кода C ++ 11 в вызывающей функции? - PullRequest
0 голосов
/ 15 мая 2018

У меня есть лямбда, которую я хочу использовать более одного раза, но я хочу, чтобы во второй раз она работала как минимум с одной другой переменной (capture).Является ли этот подход - использование захваченного указателя ref внутри лямбды, перенаправленного в вызывающем коде, на другую переменную - нормальным / разумным способом сделать это?Или я должен использовать отдельный механизм или вообще другой подход?

MyStruct ms1;
MyStruct* pActiveMyStruct = &ms1;
auto lambda = [&]( const Foo& foo, u32 index )
{
    pActiveMyStruct->sScore = foo.m_Score;
    pActiveMyStruct->DoSomethingWith( index );
};
pProcessor->ApplyLambdaOn( lambda );

MyStruct ms2;
pActiveMyStruct = &ms2;
pProcessor->ApplyLambdaOn( lambda );

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

Функционально-стилевым подходом было бы использование замыкания:

MyStruct ms1, ms2;
auto makeLambda = [](MyStruct& ms) {
    return [&ms](const Foo& foo, u32 index) {
        ms.sScore = foo.m_Score;
        ms.DoSomethingWith(index);
    };
};

pProcessor->ApplyLambdaOn(makeLambda(ms1));
pProcessor->ApplyLambdaOn(makeLambda(ms2));
0 голосов
/ 15 мая 2018

Я думаю, что следующие варианты лучше, чем использование ссылки на указатель.

Вариант 1

Использовать ссылку на сам объект MyStruct вместо ссылки на указатель.

MyStruct ms1;
auto lambda = [&ms1]( const Foo& foo, u32 index )
{
    ms1.sScore = foo.m_Score;
    ms1.DoSomethingWith( index );
};

pProcessor->ApplyLambdaOn( lambda );

MyStruct ms2;
ms1 = ms2;
pProcessor->ApplyLambdaOn( lambda );

Вариант 2

Передайте объект MyStruct лямбда-функции.

auto lambda = [&ms1]( const Foo& foo, u32 index, MyStruct& ms )
{
    ms.sScore = foo.m_Score;
    ms.DoSomethingWith( index );
};

Чтобы сделать это, pProcessor->ApplyLambdaOn должен иметь доступ к объекту MyStruct. Вы можете сделать это несколькими способами.

  1. Сохраните объект MyStruct в pProcessor и используйте его при реализации ApplyLambdaOn.

    pProcessor->setData(ms1);
    pProcessor->ApplyLambdaOn( lambda );
    
    MyStruct ms2;
    pProcessor->setData(ms2);
    pProcessor->ApplyLambdaOn( lambda );
    
  2. Передайте объект MyStruct в ApplyLambdaOn в качестве другого аргумента.

    pProcessor->ApplyLambdaOn( lambda, ms1 );
    
    MyStruct ms2;
    pProcessor->ApplyLambdaOn( lambda, ms2 );
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...