2013-09-26 9 views
5

Ist es möglich, einen Lambda-Ausdruck als Klassenattribut zu verwenden? Ich arbeite an einem kleinen Spiel in C++, wo alle Bots die gleiche Update-Routine haben, aber jeder sollte seine eigene optionale zusätzliche Update-Routine haben.Lambda-Ausdruck als Klassenattribut?

dachte ich, etwas wie das

class Bot 
{ 
private: 
    Lambdatype lambda; 

public: 
    Bot(Lambda l) {lambda = l;} 
    update() { dosomething(); lambda(); } 
}; 
+0

BTW verwenden, wird es geschrieben "Lambda" :) – StilesCrisis

+0

Jeder Lambda-Ausdruck eine einzigartige Art hat, so dass ich glaube nicht, es ist möglich. Betrachte 'auto x = [] {}; Automatisch y = [] {}; std :: is_same {} // ergibt false'. – dyp

+0

@StilesCrisis Ah, danke :) in den frühen Tagen dachte ich, es wäre buchstabiert lambada – user2796729

Antwort

7

Sie std::function verwenden können, beispielsweise annehmen, dass es void Funktion ist und bekommt zwei int:

class Bot 
{ 
private: 
    using Lambda = std::function<void(int, int) >; 
    Lambda lambda; 

public: 

    Bot(const Lambda &l) : lambda(l) 
    { 
    } 

    void update() 
    { 
     //dosomething...; 
     lambda(1, 2); 
    } 
}; 

int main() 
{ 
    Bot bot ([](int x, int y){ cout << x+y << endl; }); 

    bot.update(); 
} 

Weitere generic:

template <typename L> 
class Bot 
{ 
private: 
    L lambda; 

public: 

    Bot(const L &l) : lambda(l) 
    { 
    } 

    void update() 
    { 
     //dosomething...; 
     lambda(1, 2); 
    } 
}; 

int main() 
{ 
    Bot<std::function<void(int,int)>> bot (
         [](int x, int y){ cout << x+y << endl; } 
    ); 
    bot.update(); 
} 

Vorlage basiert:

template <typename L> 
struct Bot 
{ 
private: 
    L lambda; 

public: 
    Bot(const L &l) : lambda{l} {} 
    void update() { lambda(1,2); } 
}; 

int main() 
{ 
    auto l = [](int x, int y){ std::cout << x + y << std::endl; }; 

    Bot<decltype(l)> bot(l); 

    bot.update(); 
} 
+0

Cool es läuft, danke !! – user2796729

+1

Zusatznutzen: Sie sind jetzt nicht auf Lambda's beschränkt, Sie können alles mit der richtigen Signatur speichern. – MSalters

1

addional können Sie make_bot

template< class L > 
struct bot 
{ 
    bot(L l) : lambda{l} {} 
    void update() { lambda(1,2); } 
private: 
    L lambda; 
}; 

template< class L > bot<L> make_bot(L l) { return {l}; } 

int main() 
{ 
    auto my_bot = make_bot([](int x, int y){ std::cout << x + y << std::endl;}) ; 

    my_bot.update(); 
} 
+0

Das Problem bei dieser Technik ist, dass jeder Bot seinen eigenen Lambdatyp hat und daher seinen eigenen Typ "bot " hat. Das bedeutet, dass Sie keine Sammlung von Bots mehr haben können. – MSalters

+0

@MSalter. std :: tuple um Hilfe zu holen :) –

Verwandte Themen