我有一个我希望不止一次使用的lambda,但我希望它第二次在至少一个不同的(捕获)变量上运行。这种方法 - 使用在调用代码中重定向的lambda内的捕获指针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 );
答案 0 :(得分:4)
功能风格的方法是使用闭包:
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));
答案 1 :(得分: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 );
将MyStruct
对象传递给lambda函数。
auto lambda = [&ms1]( const Foo& foo, u32 index, MyStruct& ms )
{
ms.sScore = foo.m_Score;
ms.DoSomethingWith( index );
};
为了能够做到这一点,pProcessor->ApplyLambdaOn
必须能够访问MyStruct
对象。你可以做到这几种方式。
将MyStruct
对象存储在pProcessor
中,并在ApplyLambdaOn
的实现中使用它。
pProcessor->setData(ms1);
pProcessor->ApplyLambdaOn( lambda );
MyStruct ms2;
pProcessor->setData(ms2);
pProcessor->ApplyLambdaOn( lambda );
将MyStruct
对象传递给ApplyLambdaOn
作为另一个参数。
pProcessor->ApplyLambdaOn( lambda, ms1 );
MyStruct ms2;
pProcessor->ApplyLambdaOn( lambda, ms2 );