C++ 围绕QObject::connect的函数包装器

C++ 围绕QObject::connect的函数包装器,c++,qt,templates,lambda,signals-slots,C++,Qt,Templates,Lambda,Signals Slots,我正在尝试编写一个函数,将其参数传递给QObject::connect template <typename Func1, typename Func2> void addConnection(const QObject* sender, Func1 signal, Func2 slot) { m_connections.push_back(QObject::connect(sender, signal, slot)); } 这将导致一个错误: 'QObject::conn

我正在尝试编写一个函数,将其参数传递给
QObject::connect

template <typename Func1, typename Func2>
void addConnection(const QObject* sender, Func1 signal, Func2 slot)
{
    m_connections.push_back(QObject::connect(sender, signal, slot));
}
这将导致一个错误:

'QObject::connect' : none of the 4 overloads could convert all the argument types

但是我不知道为什么它不工作。

你读过编译器错误消息了吗?编译器在5个重载函数中不知道合适的
QObject::connect()
函数。

如果您使用下面的代码,编译将成功

addConnection( &m_scannerSystem, SIGNAL( signalStatus( int ) ), this, SLOT( onStatusChanged( int ) ) );

您的问题是,您试图传递一个指向QObject的指针,但在这种情况下,您如何能够调用另一个对象的成员函数(在您的情况下是ScannerSysterm)?系统必须知道传递的发送者的实际类型。因此,您可以通过以下方式进行修复:

template <typename Sender, typename Func1, typename Func2>
void addConnection(const Sender* sender, Func1 signal, Func2 slot)
{
    QObject::connect(sender, signal, slot);
}
模板
无效添加连接(常量发送器*发送器,Func1信号,Func2插槽)
{
QObject::connect(发送器、信号、插槽);
}
或者通过使用一些神奇的Qt特性:

template <typename Func1, typename Func2>
void addConnection(const typename QtPrivate::FunctionPointer<Func1>::Object* sender, Func1 signal, Func2 slot)
{
    QObject::connect(sender, signal, slot);
}
模板
void addConnection(const typename QtPrivate::FunctionPointer::Object*sender,Func1信号,Func2插槽)
{
QObject::connect(发送器、信号、插槽);
}

为什么要按值传递?@deW1我在传递函数指针,为什么不按值传递它们?QObject::connect具有相同的签名。可能的重复项我无法使用此重载连接到lambda。我正在使用新的Qt5语法:我不明白为什么只使用lambda。我认为lambda在这种情况下不是强制性的。我错了吗?啊,当然,我认为通过lambda是有问题的,但完全没有做到。我也喜欢您的解决方案,因为它不必使用Qt的私有API。
template <typename Func1, typename Func2>
void addConnection(const typename QtPrivate::FunctionPointer<Func1>::Object* sender, Func1 signal, Func2 slot)
{
    QObject::connect(sender, signal, slot);
}