C ++ 11多播委托实现

时间:2014-09-15 22:13:50

标签: c++ c++11 delegates

我想将代理添加到我的游戏引擎中。我已经习惯了c#,现在我不能没有它们。

我在这里和外部资源上看到了几个实现,但它们不是多播的。委托只允许一次存储一个监听器。有没有人知道在+ =和 - =支持的内存/性能方面有什么好的实现?我曾尝试使用可变参数模板编写我的文章,但我还没有。

编辑:这是我到目前为止所得到的:

template<typename ... Args>
class Delegate
{
public:
   Delegate() =default;
   ~Delegate() = default;

   template<typename U>
   Delegate& operator += (const U &func)
   {
        _listeners.push_back(std::function<void(Args...)>(func));
        return *this;
   }

   template<typename Class, typename Method>
   Delegate& operator += (const std::function<void(Args...)> func)
   {
        _listeners.push_back(func);
        return *this;
   }

   void operator() (Args... params)
   {
        for (auto listener : _listeners)
        {
            listener(params...);
        }
   }

   private:
       std::list<std::function<void(Args...)>> _listeners;
};

工作得非常好。在这里你可以看到如何使用它:

Delegate<std::string> del;
del += std::bind(&GameScene::print, this, std::placeholders::_1);
del += [](const std::string& str) { log(str.c_str()); };
del("text");

我知道我几乎一直都会使用std :: bind版本,因为这是在事件消息系统中使用的,实例会使用类方法订阅委托(通过类方法我不是指静态方法但是一种方法)。反正有没有改进std :: bind部分?我认为当你不得不用占位符等添加一些功能时,它有点难看和烦人......

干杯。

1 个答案:

答案 0 :(得分:1)

基本上,一个天真的C ++ 11实现可能看起来像:

#include <vector>
#include <functional>

class Foo
{
    public:

        std::vector< std::function< void() > > onSomething;
};

int main( void )
{
    Foo f;

    f.onSomething.push_back( [&] { /* Do something... */ } );
    f.onSomething.push_back( [&] { /* Do something else... */ } );

    return 0;
}

请注意使用std::function,它允许将lambda存储在vector中 然后,您将能够迭代向量,并执行每个lambda。

然后,当然,如果需要,操作员重载和线程安全......但这应该是微不足道的。