简单 EventHandler/Provider 使用可变参数模板和函数指针

Simple EventHandler/Provider using a variadic template and function pointers

我正在尝试实现一个 EventProvider/Handler 系统,以便于为学校项目设置一个带有反应式 GUI 的小型应用程序。这种对更广泛的观察者模式的特殊方法不是强制性的,但它似乎是最健壮和最轻量级的——只要它实际上是可能的。

#pragma once

#include <vector>;
#include <algorithm>;

/// Provides a lightweight interface for implementing event-based behaviour.
template <class ...arg> class EventProvider
{
public:
    /// Defines a pointer to a function equipped to handle an event from this provider.
    typedef void( *EventHandler )(arg... arguments);

    EventProvider();
    virtual ~EventProvider();

    void Subscribe( EventHandler handler );
    void Unsubscibe( EventHandler handler );

    void Notify( arg... arguments );

protected:
    vector<EventHandler> _handlers;
};

template<class ...arg>
EventProvider<...arg>::EventProvider()
{}

template<class ...arg>
EventProvider<...arg>::~EventProvider()
{}

template<class ...arg>
inline void EventProvider<...arg>::Notify( arg... arguments )
{
    for ( auto handler : _handlers )
    {
        handler( arguments );
    }
}

template<class ...arg>
inline void EventProvider<...arg>::Subscribe( EventHandler handler )
{
    if ( find( _handlers.begin(), _handlers.end(), handler ) == _handlers.end() )
    {
        _handlers.push_back( handler );
    }
}

template<class ...arg>
inline void EventProvider<...arg>::Unsubscibe( EventHandler handler )
{
    _handlers.erase( remove( _handlers.begin(), _handlers.end(), handler ),     _handlers.end() );
}

到目前为止,我自己构建的很好,但如果我真的尝试包含这个 header 并在其他地方使用代码,我会得到很多错误,所有错误都是.. .

C2238 unexpected token(s) preceding ';'

C2143 syntax error: missing ';' before '<'

C4430 missing type specifier - int assumed. Note: C++ does not support default-int

在我声明我的 EventHandlers 向量的那一行:

vector<EventHandler> _handlers;

C2509 syntax error: '...'

C3211 'EventProvider<>::FunctionName': explicit specialization is using partial specialization syntax, use template <> instead

在 class 模板声明之后的实现中的所有函数签名,例如:

template<class ...arg>
EventProvider<...arg>::EventProvider()
{}

1) 你应该写

EventProvider<arg...>::

而不是

EventProvider<...arg>::

2) 在

template<class ...arg>
inline void EventProvider<arg...>::Notify( arg... arguments )
{
    for ( auto handler : _handlers )
    {
        handler( arguments );
    }
}

arguments是一个可变参数,所以你必须用...解压它;我想

 handler( arguments ... );

3) 在

protected:
   vector<EventHandler> _handlers;

你必须在 vector 之前使用 std::(或在 using namespace std; 之前添加)

4) include 后不需要分号,所以,

#include <vector>
#include <algorithm>

而不是

#include <vector>;
#include <algorithm>;