如何将模板函数指针作为值参数添加到地图中

时间:2017-04-13 13:27:24

标签: c++ c++11 templates

我有一个工作框架,我正在使用地图在给定某个枚举的情况下运行某个函数。刚才这导致我有很多功能,都有相同的签名,而且很多都有相同的代码。因此,我想提供一个模板函数指针作为地图中的值。 这是工作设置:

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

能够添加此模板会减少很多代码。如果有人对如何实现这一点有任何想法,我将非常感激。

由于

1 个答案:

答案 0 :(得分:0)

这里没有真正的问题,你只需要获取函数模板实例的地址:

func_map{
    {FIRST,  &MainWindow::handle_all<FirstType, OutputWidget>},
    {SECOND, &MainWindow::handle_all<SecondType, OutputWidget>}
}