2016-04-28 2 views
0

У меня есть следующий код:Как правильно переписать C++ 11 лямбда-выражение без лямбда выраж

class Variant 
{ 
public: 
    void init(); 
} 

void Variant::init() 
{ 
    int var 1; 
    vector list; 
    vector list2; 

    tbb::parallel_for(tbb::blocked_range<std::size_t>(0, list.size(), ClrSize), 
    [this, &var1, &list,&list2](const tbb::blocked_range<std::size_t> &range) 
    { 
     /*some code here*/ 
    } 

Я думал о реализации operator()(const tbb::blocked_range<std::size_t> &range)

class Variant 
{ 
public: 
    void operator()(const tbb::blocked_range<std::size_t> &range) 
    { 
     /*some code here*/ 
    } 
    void init(); 
} 

void Variant::init() 
{ 
    int var 1; 
    vector list; 
    vector list2; 

    tbb::parallel_for(tbb::blocked_range<std::size_t>(0, list.size(), ClrSize), this); 
} 

, но это не решает проблема списка захвата.

Как я могу переписать выражение лямбда? Что я могу сделать с var1, list, list2 arguments?

Благодаря

ответ

1

Вы захват в конструкторе функтора вы делаете, и передать переменный захват в качестве аргументов конструктора. Это проще всего использовать отдельный класс, а не пытаться повторно использовать объект, существует в.

class MyFunctor 
{ 
    Variant& x; int& y; vector& z; vector& foo; 
public: 
    MyFunctor(Variant& x, int& y, vector& z, vector& foo) : x(x), y(y), z(z), foo(foo) {}; 
    void operator()(const tbb::blocked_range<std::size_t> &range) 
    { 
     /* use x, y, z and foo here */ 
    } 
} 

затем init сделать экземпляр MyFunctor пройти.

+0

Вы имели в виду, что я должен использовать такой код? * tbb :: parallel_for (tbb :: blocked_range (0, list.size(), ClrSize), MyFunctor (x, y, z, foo)) * – Deachy

+0

@Deachy: Ну, в вашем случае, я думаю, что аргументы пройдены 'MyFunctor' будет' * this, var1, list, list2', но да, это идея; C++ 11 lambdas - это просто синтаксический сахар для анонимных определений функторов, которые связывают переменные (аргументы с конструктором, которые становятся членами экземпляра functor) и предоставляют метод 'operator()', который может использовать эти захваченные переменные. – ShadowRanger

Смежные вопросы