2013-09-26 65 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来帮忙:) –