2013-09-26 93 views
5

是否可以使用lambda表達式作爲類屬性? 我正在C++中進行一個小遊戲,其中所有殭屍程序都具有相同的更新例程,但每個人都應該有自己的可選額外更新例程。作爲類屬性的Lambda表達式?

我想類似的東西

class Bot 
{ 
private: 
    Lambdatype lambda; 

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

順便說一句,它的拼寫爲 「拉姆達」 :) – StilesCrisis

+0

每個lambda表達式具有獨特的類型,所以我不認爲這是可能的。考慮'auto x = [] {}; auto y = [] {}; std :: is_same {} //產生false。 – dyp

+0

@StilesCrisis啊,謝謝你:)在早期的時候我以爲它會拼寫蘭達達 – user2796729

回答

7

您可以使用std::function,例如假設它是void功能,增加了兩個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(); 
} 

更通用:

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

模板基於:

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

很酷它跑,謝謝!! – user2796729

+1

額外的好處:你現在不限於lambda,你可以存儲任何有正確簽名的東西。 – MSalters

1

Addional您可以使用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

這種技術的問題在於每個機器人都有自己的lambda類型,因此它有自己的'bot '類型。這意味着你不能再有一批機器人了。 – MSalters

+0

@ MSalters。 std :: tuple來幫忙:) –