c++ - C++ 为每个元素调用任意函数
问题描述
我有一个字符串列表,对于每个字符串,我想调用具有不同所需参数的任意函数。
例子:
void method1(QString name, int foo1){}
void method2(QString name, int foo2, bool flag(){}
QStringList list;
list << "ELEM1" << "ELEM2";
现在我想要一个函数,我可以将任何函数传递给它,并使用列表中每个元素的给定值调用它
void callForAll((MyClass::*pt2ConstMember)(QString,X,X)){
foreach(QString element, list){
(*m_class.*pt2ConstMember)(element,X,X);
}
}
callForAll(&MyClass::method1, 4);
callForAll(&MyClass::method2, 6, false)
从本质上讲,我似乎想做这样的事情: C++:指向具有可变数量参数的函数的函数指针,还是我在这个方面走错了路?
更复杂的是,不应直接调用 callForAll 函数,而应使用 Qt 中的信号/插槽。所以我需要带有可变参数和函数指针的信号:
在发送者类中:信号:
template<typename F, typename ...PP >
void sigForAll(F f, PP&& ... pp);
用法:
emit sigForAll(&Receiver::method1, 5, true)
在接收器类中:
template<typename F, typename ...PP >
void ForAll(F f, PP&& ... pp);
在包含发送者和接收者类的成员实例的第三类中:
connect(m_sender, SIGNAL(sigForAll(F f, PP&& ... pp)), m_receiver, SLOT(ForAll(F f, PP&& ... pp)))
解决方案
您可以使用 lambda。它将比指向成员的解决方案更好地优化:
template <typename F>
void callForAll(F const& f) {
foreach(QString element, list) {
f(element);
}
}
callForAll([&m_class](QString const& s){ m_class.method1(s, 4); });
callForAll([&m_class](QString const& s){ m_class.method2(s, 6, false); });
推荐阅读
- netlogo - NetLogo If 命令
- jquery - jquery - Mailchimp 跨域读取阻止 (CORB) 阻止了 MIME 类型 application/json 的跨域响应
- amazon-web-services - 如何从 EMR Spark 集群连接到远程 Kafka 集群?
- ruby-on-rails-4 - 生产模式下的 Rails 4.2 中未加载 CSS
- javascript - Kendo Grid 在单元格编辑期间禁用另一列
- visual-studio - 如何安装旧版本的 Visual Studio 预览版
- django - 将 vimeo 视频限制为域级隐私不起作用
- ffmpeg - 使用 ffmpeg 将直播从 m3u8 录制到管道会导致视频没有音频
- c - 如何创建循环以在 C 中的功能菜单之间切换?
- github - github ssh 密钥不被接受,得到 ssh 数据包类型 51 (