2013-09-26 24 views
5

Czy można użyć wyrażenia lambda jako atrybutu klasy? Pracuję nad małą grą w C++, w której wszystkie boty mają tę samą procedurę aktualizacji, ale każdy powinien mieć własną opcjonalną procedurę dodatkowej aktualizacji.Wyrażenie Lambda jako atrybut klasy?

Myślałem coś takiego

class Bot 
{ 
private: 
    Lambdatype lambda; 

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

BTW, to pisane "lambda" :) – StilesCrisis

+0

Każde wyrażenie lambda posiada unikalny typ, więc nie sądzę, że to możliwe. Rozważmy "auto x = [] {}; auto y = [] {}; std :: is_same {} // daje false ". – dyp

+0

@StilesCrisis Ah, dziękuję :) we wczesnych dniach myślałem, że to będzie napisane lambda – user2796729

Odpowiedz

7

Można użyć std::function, na przykład założyć, że to void funkcja i dostaje dwa 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(); 
} 

bardziej ogólne:

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

szablon oparty:

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

Fajnie działa, dziękuję !! – user2796729

+1

Dodatkowa zaleta: nie jesteś teraz ograniczony do lambda, możesz przechowywać wszystko, co ma prawidłowy podpis. – MSalters

1

Addional można użyć 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

Problem z tą techniką polega na tym, że każdy bot ma swój własny typ lambda, a więc jego własny typ "bot ". Oznacza to, że nie możesz już mieć zbioru botów. – MSalters

+0

@MSalters. std :: tuple, aby przyjść po pomoc :) –