C++ 创建现有模板类的模板
我正在尝试创建现有模板的模板。这可能吗?怎么做 我尝试使用函数声明C++ 创建现有模板类的模板,c++,templates,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. template std:
template<typename... Args> std::pair<char*, std::vector<void(*)(Args...)>> events_list;
events_list<ButtonEvent> button_event; // Doesn't work : pointer to function conversion.
template std::pair events\u list;
事件列表按钮事件;//无效:指向函数转换的指针。
我希望结果是这样一个简单的on/emit事件处理程序
static void onClick(ButtonEvent e) {
printf(e.buttonId);
}
events_list<ButtonEvent> button_event;
button_event.push_back(onClick);
static void onClick(ButtonEvent e){
printf(e.buttonId);
}
事件列表按钮事件;
按钮事件。推回(onClick);
您是指模板类型别名吗
如果是这样,则必须稍微更改语法:
template<typename... Args>
using events_list = std::pair<char*, std::vector<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);
});
对于经常使用的“函数”对象,它将使您的生活更加轻松。看起来您正在尝试模仿java OOP的工作方式。善意的建议:不要。谢谢,我会试试
std::function
。为什么输入别名?我不明白。为什么不呢@YSC@user11051353java是java,C++是C++。大多数的java习语正在慢慢被习惯用法所取代,这正是C++的做事方式。这正是我想要做的,谢谢你们两个!这是一种很好的方法吗?因为你说它模仿了JavaOOP的工作方式?对不起,什么是爪哇语?@GuillaumeRacicot嗯,这要看情况而定。没有大局是很难把握的。如果您只是尝试模仿语法(以及它的实现方式),那么您可能会有一段不愉快的时光(您知道,没有GC,很多新的等等)。如果您试图提供一个类似的接口,使其看起来更简单,但在实现中会降低复杂性。那么这可能是值得的。但根据经验,当我试图将习语从一种语言复制到另一种语言时,我能够使事情看起来更好。当然,我可以通过迭代来实现这一点。在继续之前,我将看看模板可以做些什么。非常感谢你的帮助
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);
});