我有一个工作框架,我正在使用地图在给定某个枚举的情况下运行某个函数。刚才这导致我有很多功能,都有相同的签名,而且很多都有相同的代码。因此,我想提供一个模板函数指针作为地图中的值。 这是工作设置:
QMap <ENUM,OutputWidget *(MainWindow::*)()>func_map;
OutputWidget *handle_first();
OutputWidget *handle_second();
func_map{{FIRST,&MainWindow::handle_first},{SECOND,&MainWindow::handle_second}};
OutputWidget *output1 = (this->*func_map[FIRST])();
OutputWidget *output2 = (this->*func_map[SECOND])();
我希望能够改变func_map来处理这个签名,但是我还没弄清楚如何:
template <typename INPUTTYPE,typename OUTPUTTYPE> OUTPUTTYPE *handle_all();
我已尝试将此模板添加到地图中;
func_map{{FIRST,&MainWindow::handle_first},SECOND,&MainWindow::handle_second},{THIRD,&MainWindow::handle_all<FirstInputWidget,ThirdOutputWidget>}}
但是这导致了以下错误:
../TemplateTest/mainwindow.cpp: In constructor ‘MainWindow::MainWindow(QWidget*)’:../TemplateTest/mainwindow.cpp:9:14: error: no matching function for call to ‘QMap<ENUM, OutputWidget* (MainWindow::*)()>::QMap(<brace-enclosed initializer list>)’
}
能够添加此模板会减少很多代码。如果有人对如何实现这一点有任何想法,我将非常感激。
由于
答案 0 :(得分:0)
这里没有真正的问题,你只需要获取函数模板实例的地址:
func_map{
{FIRST, &MainWindow::handle_all<FirstType, OutputWidget>},
{SECOND, &MainWindow::handle_all<SecondType, OutputWidget>}
}