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

C++ call arbitrary function for each element

本文关键字:调用 任意 函数 元素 C++      更新时间:2023-10-16

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

例:

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