首页 > 解决方案 > 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)))

标签: c++pointers

解决方案


您可以使用 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); });

推荐阅读