Lambda表达式作为类属性?

5

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

我的想法是这样的:

class Bot
{
private:
    Lambdatype lambda;

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

顺便说一下,它的拼写是“lambda” :) - StilesCrisis
每个lambda表达式都有一个独特的类型,所以我认为这是不可能的。考虑auto x = []{}; auto y = []{}; std::is_same<decltype(x), decltype(y)>{} // yields false - dyp
@StilesCrisis 啊,谢谢 :) 在早期我还以为它会被拼成 lambada。 - user2796729
2个回答

7

您可以使用std::function,例如假设它是一个获取两个int参数的void函数:

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
额外的好处是:现在你不再受限于lambda,你可以存储任何具有正确签名的东西。 - MSalters

1
额外的,你可以使用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();
}

这种技术的问题在于每个机器人都有自己的 lambda 类型,因此也有自己的 bot<L> 类型。这意味着你不能再拥有一个机器人集合了。 - MSalters
@MSalters。std::tuple来帮忙 :) - Khurshid Normuradov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接