C++11 中的别名结构
Aliasing Structs in C++11
我正在编写一个涉及事件和回调的 C++11 程序。我有一个名为 Event 的基础 class,然后由具体事件派生 classes.
template <typename EventArgs>
class Event {
public:
using EventHandler = std::function<void(EventArgs)>;
void operator +=(EventHandler handlerDelegate);
void fire(EventArgs e);
private:
std::vector<EventHandler> subscribers;
};
struct TouchEventArgs { int x, int y }
struct TouchEvent : public Event<TouchEventArgs> { }
...
我想知道这样的事情是否可能:
template <typename EventArgs>
using event = struct : public Event<EventName> { };
这样我就可以声明像
这样的事件
event<TouchEventArgs> TouchEvent;
您可以维护事件类型及其参数类型之间的编译时映射:
namespace detail {
//primary template
template <typename EventArgs>
struct event;
//the event for TouchEventArgs is TouchEvent
template<> struct event<TouchEventArgs>
{ using type = TouchEvent; };
}
//helper template
template <typename EventArgs>
using event = typename detail::event<EventArgs>::type;
现在我们可以像您想要的那样声明一个变量(假设名称冲突是偶然的):
event<TouchEventArgs> touch_event; //decltype(TouchEvent) is TouchEvent
我正在编写一个涉及事件和回调的 C++11 程序。我有一个名为 Event 的基础 class,然后由具体事件派生 classes.
template <typename EventArgs>
class Event {
public:
using EventHandler = std::function<void(EventArgs)>;
void operator +=(EventHandler handlerDelegate);
void fire(EventArgs e);
private:
std::vector<EventHandler> subscribers;
};
struct TouchEventArgs { int x, int y }
struct TouchEvent : public Event<TouchEventArgs> { }
...
我想知道这样的事情是否可能:
template <typename EventArgs>
using event = struct : public Event<EventName> { };
这样我就可以声明像
这样的事件event<TouchEventArgs> TouchEvent;
您可以维护事件类型及其参数类型之间的编译时映射:
namespace detail {
//primary template
template <typename EventArgs>
struct event;
//the event for TouchEventArgs is TouchEvent
template<> struct event<TouchEventArgs>
{ using type = TouchEvent; };
}
//helper template
template <typename EventArgs>
using event = typename detail::event<EventArgs>::type;
现在我们可以像您想要的那样声明一个变量(假设名称冲突是偶然的):
event<TouchEventArgs> touch_event; //decltype(TouchEvent) is TouchEvent