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

时间:2013-02-05 08:26:03

标签: 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将要进入我的函数的论点。我需要使用哪种类型?

1 个答案:

答案 0 :(得分:8)

有两种选择:

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