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

Pass function member pointer as parameter to function

本文关键字:函数 参数传递 指针 成员      更新时间:2023-10-16

我正在做一个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;");

上面写着:

错误:调用applytollabels没有匹配的成员函数

候选模板被忽略:无法匹配'QLabel'和'QWidget'

解决方案吗?由于

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

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

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

我也使函数指针参数不同于你传递的参数,因为你试图传递一个const char(&)[11],而不是一个QString,但转换为一个。