C++11 多播委托(delegate)实现

标签 c++ c++11 delegates

我想将委托(delegate)添加到我的游戏引擎中。我在 C# 中已经习惯了它们,现在我离不开它们。

我在这里和外部资源上看到了几个实现,但它们不是多播的。委托(delegate)一次只能存储一个监听器。有谁知道在 += 和 -= 支持下在内存/性能方面有什么好的实现吗?我已经尝试使用可变参数模板编写我的代码,但我还没有做到这一点。

编辑:这是我到现在为止所拥有的:

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 版本,因为它用于事件消息系统,实例将使用类方法订阅委托(delegate)(通过类方法,我不是指静态方法,而是类的一个方法)。无论如何改进 std::bind 部分?我认为当你必须添加一些带有占位符等的函数时,这有点丑陋和烦人......

干杯。

最佳答案

基本上,一个简单的 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 中。
然后,您将能够遍历 vector ,并执行每个 lambda。

然后,当然,运算符重载和线程安全(如果需要的话)......但这应该是微不足道的。

关于C++11 多播委托(delegate)实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25857728/

相关文章:

c++ - 在 C++ 中格式化 SQL 查询

c++ - 从 C++ 模板中的非 const 左值引用推导出 const 左值引用

c++ - 将任何函数作为模板参数传递

ios - Dropbox 委托(delegate)方法不是第一次调用

c++ - QListView 样式表不适用于委托(delegate)

java - JNA 通过引用传递 char*

c++ - nullptr 与 __nullptr

c++ - 为什么这种使用 putchar_unlocked 的方法打印字符串比 printf 和 cout 慢?

c++ - 为什么整数到字符串的转换直到现在才明确包含在 C++ 中?

ios - 委托(delegate)方法如何在 Swift 中工作?