QObject::connect 和模板导致问题

QObject::connect and template causes issue

我想在基础 class 中为 QObject::connect 提供代理。目标是将 connect 返回的所有 QMetaObject::Connection 存储在一个向量中。

class MyBaseClass : public QObject {
    Q_OBJECT;

    template <typename... Args>
    void addConnection(Args... args) {
        auto c = this->connect(args...);
        if (c) {
            connections.push_back(c);
        }
    }

问题是连接不再有效。当我从继承 MyBaseClass 的 class 发出信号时,它什么也不做。例如,这确实有效:

connect(this, &ClassThatInheritsBaseClass::valueChanged, [this](int v) {
    qDebug() << QString::number(value);
}

但这不起作用:

addConnection(this, &ClassThatInheritsBaseClass::valueChanged, [this](int v) {
    qDebug() << QString::number(value);
}

有人能解释一下为什么它不起作用吗?以及如何让它发挥作用?

它是有效代码,适用于 variadic templatesstd::tuple。下面的代码是完整的示例:

Header:

#ifndef MYBASECLASS_H
#define MYBASECLASS_H

#include <QObject>

class MyBaseClass : public QObject {

    Q_OBJECT
    std::vector<QMetaObject::Connection> connections;
public:
    template <typename T>
    void addConnectionTuple(const T& t) {//not best
        auto c = this->connect(std::get<0>(t),std::get<1>(t),std::get<2>(t));
        if (c) {
            connections.push_back(c);
        }
    }

    template <typename... Args>
    void addConnection(Args... args) {
        auto c = this->connect(args...);
        if (c) {
            connections.push_back(c);
        }
    }
};

#endif // MYBASECLASS_H

代码:

QObject aa;
MyBaseClass bb;
std::make_tuple(10,5);
    bb.addConnectionTuple(std::make_tuple(&aa, &QObject::objectNameChanged, [](QString v) {
    qDebug() << v;
}));
aa.setObjectName("super");

QObject aa;
MyBaseClass bb;
std::make_tuple(10,5);
    bb.addConnection(&aa, &QObject::objectNameChanged, [](QString v) {
    qDebug() << v;
});
aa.setObjectName("super");

std::forward 也有效。

template <typename... Args>
void addConnection(Args... args) {
    auto c = this->connect(std::forward<Args>(args)...);
    if (c) {
        connections.push_back(c);
    }
}