Lambda表达式作为类属性?

时间:2013-09-26 23:42:00

标签: c++ c++11 lambda

是否可以将lambda表达式用作类属性? 我正在使用C ++编写一个小游戏,其中所有机器人都有相同的更新例程,但每个人都应该有自己的可选额外更新例程。

我认为这样的事情

class Bot
{
private:
    Lambdatype lambda;

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

2 个答案:

答案 0 :(得分: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();
}

答案 1 :(得分: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();
}