使用可变模板和函数指针的简单事件处理程序/提供程序



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

#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() );
}

到目前为止,我所拥有的本身构建得很好,但如果我真的尝试包含这个标头并在其他地方使用代码,我会得到几十个错误,所有这些错误都是。。。

";"前面的C2238意外令牌

C2143语法错误:缺少";"在'<'之前

C4430缺少类型说明符-假定为int。注意:C++不支持默认int

在我声明EventHandlers向量的行上:

vector<EventHandler> _handlers;

C2509语法错误:"…">

C3211事件提供程序<>:FunctionName':显式专门化使用部分专门化语法,请使用模板<>而是

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

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>;

相关内容

  • 没有找到相关文章

最新更新