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