2016-04-28 10 views
0

neu schreiben habe ich einen Code ein:Wie kann ich richtig C++ 11 Lambda-Ausdruck ohne Lambda ausdr

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*/ 
    } 

ich dachte operator()(const tbb::blocked_range<std::size_t> &range) Umsetzung

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); 
} 

aber es löst nicht Aufnahme Listenproblem.

Wie kann ich Lambda-Ausdruck neu schreiben? Was kann ich mit var1, list, list2 Argumente tun?

Dank

Antwort

1

Sie erfassen in den Konstruktor der Funktors Sie machen, und die Capture-Variablen als Argumente an den Konstruktor übergeben. Am einfachsten ist es eine eigene Klasse zu verwenden, anstatt zu versuchen, das Objekt, das Sie in existieren wiederzuverwenden.

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 */ 
    } 
} 

dann haben init eine Instanz MyFunctor machen passieren.

+0

Meinst du ich sollte Code wie diesen verwenden? * tbb :: parallel_for (tbb :: blocked_range (0, list.size(), ClrSize), MyFunctor (x, y, z, foo)) * – Deachy

+0

@ Deachy: Nun, in Ihrem Fall denke ich, dass die Argumente bestanden zu 'MyFunctor' wäre' * this, var1, list, list2', aber ja, das ist die Idee; C++ 11 Lambdas sind nur syntaktische Zucker für anonyme Definitionen von Funktoren, die Variablen binden (Argumente an den Konstruktor, die Mitglieder der Funktorinstanz werden) und stellen eine 'operator()' -Methode bereit, die diese erfassten Variablen verwenden kann. – ShadowRanger