我正在尝试实现一个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>;