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::function
和std::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++ 为每个元素调用任意函数的主要内容,如果未能解决你的问题,请参考以下文章