制作现有模板类的模板

时间:2019-02-12 14:51:20

标签: c++ templates

我正在尝试创建现有模板的模板。这可能吗 ?怎么样?

我尝试使用函数声明。

template<typename... Args> std::pair<char*, std::vector<void(*)(Args...)>> events_list;

events_list<ButtonEvent> button_event; // Doesn't work : pointer to function conversion.

我希望结果是像这样的简单on / emit事件处理程序。

static void onClick(ButtonEvent e) {
    printf(e.buttonId);
}

events_list<ButtonEvent> button_event;
button_event.push_back(onClick);

1 个答案:

答案 0 :(得分:2)

您是指模板类型别名吗?

如果是这样,则必须稍微更改语法:

template<typename... Args>
using events_list = std::pair<char*, std::vector<void(*)(Args...)>>;

如果要使用std::function代替函数指针,请尝试以下操作:

template<typename... Args>
using events_list = std::pair<char*, std::vector<std::function<void(Args...)>>;

您似乎还想要一种方便的方法来插入新事件。如果使用您选择的容器,它将看起来有些不同:

// static member function are normal function pointers.
button_event.second.push_back(&YouClass::onClick);

或者您也可以使用lambda。没有捕获,两个容器都可以工作:

button_event.second.push_back([](ButtonEvent e) {
    onClick(e);
});

// with captures (only work with the std::function)
button_event.second.push_back([this](ButtonEvent e) {
    this->onClickNonStatic(e);
});