将函数成员指针作为参数传递给函数
Pass function member pointer as parameter to function
我正在做一个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'
解决方案吗?由于
由于setStylesSheet
是QWidget
的继承成员,因此&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
,但转换为一个。
相关文章:
- 如何在C++中将迭代器作为函数参数传递
- 为什么我不能将引用作为 std::async 的函数参数传递
- 节点插件 API 将数组作为函数参数传递
- 将字符串数组作为函数参数传递
- 如何通过 C++ 中的函数参数传递初始值设定项列表的固定大小的初始值设定项列表?
- 我可以动态创建新地图并作为函数参数传递吗?
- 将任意模板向量作为函数参数C++传递
- 将函数指针作为函数参数传递的目的
- C++:通过函数参数传递的值给出不同的结果
- 当数组大小在C++中未知时,如何在运行时将对字符串数组的引用作为函数参数传递?
- 通过宏将函数参数传递给函数
- C++:访问作为函数参数传递的双指针数组所指向的变量的值
- 如何将 std::string 作为构造函数参数传递,并将其保存的 C 字符串存储在 void 指针中?
- 将派生类构造函数参数传递给受保护的成员
- 将指向数组的指针作为函数参数传递,这本身就是另一个函数的返回值?
- 如何将二维数组类型字符(字符串)作为函数参数传递?
- 有什么理由C++ 11+ std::mutex 应该声明为全局变量,而不是作为函数参数传递到 std::thread 中
- 如何将派生类作为函数参数传递:如果派生类成员不在父类中怎么办
- 如何将变量作为构造函数参数或函数参数传递
- 当数组对象以函数参数传递时,为什么复制构造函数会自称