c++ - 如何扩展这个 C++11 事件系统来处理多个参数?

标签 c++ c++11 event-handling stl

我利用 std::function 编写了一个简单的订阅者事件系统。效果很好! (稍后我可以通过线程池来进行一些重大增强,以实现昂贵的回调)

改进这一点的下一步是处理具有多个参数的事件/回调。

除了强制structs/classes或在回调参数中使用std::tuples(我想保留函数清理或使用现有的简单函数)。有没有一种好方法可以做到这一点,并且有多个模板参数都使用相同的代码?

#pragma once

#include <mutex>
#include <vector>


template<typename PARAM>
class SoyEvent
{
public:
    typedef std::function<void(PARAM&)> FUNCTION;

public:
    //  helper for member functions
    template<class CLASS>
    void            AddListener(CLASS& This,void(CLASS::*Member)(PARAM&))
    {
        //  http://stackoverflow.com/a/7582576
        auto bound = std::bind( Member, &This, std::placeholders::_1  );
        AddListener( bound );
    }
    template<class CLASS>
    void            RemoveListener(CLASS& This,FUNCTION Member)
    {
        RemoveListener( std::bind( &Member, &This ) );
    }

    //  add static or lambda
    void            AddListener(FUNCTION Function)
    {
        std::lock_guard<std::mutex> lock(mListenerLock);
        mListeners.push_back(Function);
    }
    void            RemoveListener(FUNCTION Function)
    {
        std::lock_guard<std::mutex> lock(mListenerLock);
        mListeners.erase(Function);
    }

    void            OnTriggered(PARAM& Param)
    {
        std::lock_guard<std::mutex> lock(mListenerLock);

        //  todo: execute on seperate threads with a scheduler which can just execute std::functions
        for ( auto it=mListeners.begin();   it!=mListeners.end();   it++ )
        {
            auto& Function = *it;
            Function( Param );
        }
    }

private:
    std::mutex      mListenerLock;
    std::vector<FUNCTION>   mListeners;
};

最佳答案

为什么不只使用可变参数模板,即更改类定义:

template <typename PARAM>
class SoyEvent {
     // Implementation
};

类似于:

template <typename... PARAMS>
class SoyEvent {
     // Implementation
};

然后将您的 FUNCTION typedef 更改为:

typedef std::function<void(PARAMS&...)> FUNCTION;

一般来说,将 PARAM& 的所有实例更改为 PARAMS&...

关于c++ - 如何扩展这个 C++11 事件系统来处理多个参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24725049/

相关文章:

c++ - 光不断覆盖旋转立方体的 2 个相同面

C++模板自动参数

javascript - 在单击事件监听器中添加第二个单击事件监听器

C++-在文本文件上写入时代码无法换行

c++ - 包含传递给 lua 的 std::string 的结构

c++ - 不确定为什么我的函数一直返回相同的值

c++ - std::forward 在参数传递中的用法是什么?

c++ - 使用 C++11 时扩展命名空间 std 以实现 make_unique

Android:将事件监听器添加到 ListView 中的每个项目

java - 处理线程池中不同优先级的任务