将函数成员指针作为参数传递给函数

时间:2016-08-10 16:21:19

标签: c++ qt c++11

我正在开发一个Qt项目,我决定实现一个函数,该函数接收一个指向QLabel成员函数及其参数的指针,并将其应用于某些标签。

template <class R, class ...Args>
void ClockSim::applyToLabels (R (QLabel::*f)(Args...), Args&& ...args)
{
    ui->labelSingleTime->*f (std::forward<Args>(args)...);
    //Repeat it for many other labels

}

我试着用它来调用它:

applyToLabels (&QLabel::setStyleSheet, "color:red;");

它说:

错误:没有匹配的成员函数来调用'applyToLabels'

忽略

候选模板:无法将“QLabel”与“QWidget”匹配

任何解决方案?感谢

1 个答案:

答案 0 :(得分:5)

由于setStylesSheetQWidget的继承成员,&QLabel::setStylesSheet的类型实际上是void (QWidget::*)(const QString&),并且与您的模板函数参数不匹配。< / p>

您需要为成员函数的实际类使用另一个模板参数:

template <class R, class C, class ...Params, class ...Args>
typename std::enable_if<std::is_base_of<C,QLabel>::value &&
                        sizeof...(Params)==sizeof...(Args)>::type 
ClockSim::applyToLabels (R (C::*f)(Params...), Args&& ...args)
{
    (ui->labelSingleTime->*f)(std::forward<Args>(args)...);
}

我还使得函数指针参数与传递的args不同,因为您尝试传递的const char(&)[11]不是QString,而是转换为1。