我正在开发一个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”匹配
任何解决方案?感谢
答案 0 :(得分:5)
由于setStylesSheet
是QWidget
的继承成员,&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。