c++ - C++11 中的别名结构

标签 c++ templates events c++11 alias

我正在编写一个涉及事件和回调的 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

关于c++ - C++11 中的别名结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31115107/

相关文章:

C++ - Vector 中的对象无法修改

c++ - boost library........预构建的变体?

jquery - 事件 onSeek - 中止搜索过程

c# - 是否可以在 C# 中订阅事件订阅?

JavaScript:将长按事件转换为右键单击事件

C++类模板函数可以访问嵌套类私有(private)成员

c++ - 如何处理不明确的模板参数?

c++ - 专门化模板中的一些方法

c++ - 如何使用 pack 作为模板参数实例化专门的模板类?

c++ - 是否可以创建模板类的 vector 并调用其函数?