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

Posted

技术标签:

【中文标题】C++ 为每个元素调用任意函数【英文标题】:C++ call arbitrary function for each element 【发布时间】:2019-08-12 09:05:59 【问题描述】:

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

例子:

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++: Function pointer to functions with variable number of arguments 还是我走错路了?

为了让事情变得更加复杂,不应直接调用 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)))

【问题讨论】:

这可以使用可变参数模板和std::any 作为容器并使用模板化的std::any_cast 来完成。或者使用std::functionstd::bind。或者使用 lambdas。 【参考方案1】:

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

【讨论】:

当具有信号的类无法访问 m_class 的成员时,lambda 方法是否可用于 QT 插槽? 可能。为此,您需要在问题中提供更多详细信息。 nvm 我注意到我可以将任意 callFunction 简单地放入发送者...

以上是关于C++ 为每个元素调用任意函数的主要内容,如果未能解决你的问题,请参考以下文章

调用 C++ 向量的每个元素的成员函数

c++里关于栈的函数哪些常用

将 C++ 结构指针从 Perl 传递给任意 dll 函数调用

如何在创建对象时从 QML 调用任意 C++ 函数?

数组迭代

函数调用批处理模式的C++优化