c++ - 我需要使用什么 Qt 类型来将 lambda 作为函数参数传递?

标签 c++ c++11 lambda qt5

现在 Qt5 支持将信号连接到 lambda 函数,我希望能够将 lambda 作为参数传递给另一个函数。我有一个看起来像这样的函数:

void SomeFunc(Functor f)
{
    connect(obj, &MyObject::someSignal, f);
}

但是,当我这样做时编译器会报错:

"Functor" has not been declared

Functor 更改为 QtPrivate::Functor 会产生:

QtPrivate::Functor is not a type

基本上,我想做的就是将 QObject::connect 将进入我的函数的参数传递给函数。我需要使用什么类型?

最佳答案

有两种选择:

template<typename Functor>
void SomeFunc(Functor f)
{
    connect(obj, &MyObject::someSignal, f);
}

void SomeFunc(std::function<void(/*ArgumentTypes...*/)> f)
{
    connect(obj, &MyObject::someSignal, f);
}

第一个选项只是将任何参数转发给 connect,第二个选项使用 C++11 标准库中的多态函数指针。它的模板参数必须对应于信号的签名。 Qt 信号无效,/ArgumentTypes.../需要替换为函数的参数列表。所以如果信号声明为

void someSignal(int, QString);

函数将是

std::function<void(int, QString)>

关于c++ - 我需要使用什么 Qt 类型来将 lambda 作为函数参数传递?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14703006/

相关文章:

c++ - 使用 mouseMoveEvent 限制 QGraphicsItem 的移动

c++ - g++ 6.1 可能的 std::forward 回归 - 错误或预期行为?

c# - 带有 C# : finding elements with custom predicate 的 MongoDB

c++ - 您可以在类的初始化列表中使用 Lambda 吗?

c++ - 将像素数据渲染到 OpenGL 纹理四边形中

C++:使用重载而不是动态转换通过基类选择派生类

c++ - FIFO block 程序直到其他进程读取

c++ - Qt:如何在任何 Windows 机器上使用路径创建文件?

c++ - std::sort 无法识别迭代器类别

c++ - 为什么指向 int 的指针转换为 void* 而指向函数的指针转换为 bool?