C++11中的别名结构

Aliasing Structs in C++11

本文关键字:结构 别名 C++11      更新时间:2023-10-16

我正在编写一个涉及事件和回调的C++11程序。我有一个名为Event的基类,它是由具体的事件类派生的。

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