首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C++为每个元素调用任意函数

C++为每个元素调用任意函数
EN

Stack Overflow用户
提问于 2019-08-12 17:06:00
回答 1查看 98关注 0票数 3

我有一个字符串列表,对于每个字符串,我想调用一个带有不同所需参数的任意函数。

示例:

代码语言:javascript
运行
复制
void method1(QString name, int foo1){}
void method2(QString name, int foo2, bool flag(){}

QStringList list;
list << "ELEM1" << "ELEM2";

现在我想要一个函数,我可以将任何函数传递给它,并使用列表中每个元素的给定值调用它

代码语言:javascript
运行
复制
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++: Function pointer to functions with variable number of arguments,还是我走错了路?

让事情变得更复杂的是,不应该直接调用callForAll函数,而是使用Qt中的信号/槽。所以我需要带可变参数和函数指针的信号:

在发送者类中: Signal:

代码语言:javascript
运行
复制
template<typename F, typename ...PP >
void sigForAll(F f, PP&& ... pp);

用法:

代码语言:javascript
运行
复制
emit sigForAll(&Receiver::method1, 5, true)

在receiver类中:

代码语言:javascript
运行
复制
 template<typename F, typename ...PP >
 void ForAll(F f, PP&& ... pp);

在包含发送者和接收者类的成员实例的第三个类中:

代码语言:javascript
运行
复制
 connect(m_sender, SIGNAL(sigForAll(F f, PP&& ... pp)), m_receiver, SLOT(ForAll(F f, PP&& ... pp)))
EN

回答 1

Stack Overflow用户

发布于 2019-08-12 17:17:25

您可以使用lambda。它将比指针指向成员的解决方案得到更好的优化:

代码语言:javascript
运行
复制
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); });
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57458324

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档