Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 创建现有模板类的模板_C++_Templates - Fatal编程技术网

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);
});