2017-04-27 9 views
0

는 가변 신호를 생성하고이 슬롯으로 일반 람다를 접속할 수있다? 내가 좋아하는 뭔가를 의미한다 (필요한 경우 말, 참여의 모든 기능 정의를 볼 수 있습니다 (예 : 인스턴스의 점)에서) 대신가변 인자 신호 및 일반 람다

AUTOGEN: error: process for main.cpp:18: Error: Template function as signal or slot

moc failed...

여기에 매크로 SLOT() :

#include <QCoreApplication> 
#include <QObject> 
#include <QTime> 

class A 
    : public QObject 
{ 
    Q_OBJECT 

public : 

    A(QObject * const parent = Q_NULLPTR) 
     : QObject{parent} 
    { ; } 

signals : 

    template< typename ...Ts > 
    void infoMessage(Ts... args); 

public slots : 

    void run() 
    { 
     emit infoMessage("Started at ", QTime::currentTime()); 
    } 

}; 

#include <QTimer> 
#include <QtDebug> 

#include "main.moc" 

int main(int argc, char * argv []) 
{ 
    QCoreApplication a{argc, argv}; 
    A a; 
    auto printInfoMessage = [&] (auto... args) 
    { 
     (qInfo() << ... << args); 
    }; 
    QObject::connect(&a, SIGNAL(infoMessage), printInfoMessage); 
    QTimer::singleShot(0, &a, &A::run); 
    return a.exec(); 
} 

현재 오류 메시지를 제공합니다 &A::infoMessage의 도움이되지 않습니다. 이 제한을 극복하는 해결 방법이 있습니까?

나는 대답의 일부가 std::make_tuplestd::index_sequence의 내용을 포함 할 것이라는 것을 알고있다. 하지만 덜 자세한 솔루션입니까?

답변

1

템플릿이있는 경우 직접적인 해결 방법은 없습니다. 그 이유는 moc가 모든 신호와 슬롯을 인덱싱하기 때문에 함수 템플릿은 일반적으로 moc에서 액세스 할 수없는 코드에 따라 여러 함수를 생성하기 때문에 함수 템플릿에는 사용할 수 없습니다.

튜플로 작업 할 수 있다고 생각하지 않습니다. 이것도 템플릿입니다.

해결 방법은 인수에 QVariant 및/또는 QVariantList를 사용하는 것입니다.


오류가 QObject::connect 라인에 의해 발생한 것이 있습니다 만,

또한 클래스 A의 신호 선언, 당신은 당신의 의지에 SIGNAL()SLOT()을 대체 할 수 없다, 그것은 신호 중 하나입니다 또는 슬롯은 둘 다 될 수 없습니다.

그리고 마지막으로이 양식을 사용한다 :

QObject::connect(&a, &A::infoMessage, printInfoMessage); 

그리고 자동 매개 변수를 사용 printInfoMessage 이후

, 당신은 qOverload를 사용하여 자동으로 해상도를 강제해야 할 수 있습니다

QObject::connect(&a, &A::infoMessage, qOverload<QVariantList>(printInfoMessage)); 
+0

하는 것은 불가능합니다 'someSignal (...);'함수를 인스턴스화하는 모든 변형을 모으고 링크하기 전에 모든 해당 특수화를 생성 하시겠습니까? – Orient

+0

아니요. 'moc'은 컴파일이 완료되기 전에 호출되며 Q_OBJECT 매크로가있는 파일 만 처리합니다. moc의 출력은 자신의 C++ 파일이 컴파일되는 동시에 컴파일되는 C++ 코드입니다. 그래서 링크 타임은 moc가 어떤 함수를 추가하기에는 너무 늦었다. 그러나 링크 시간도 너무 빨리 템플릿 함수의 사용 사례를 알 수 없습니다 (예 : 라이브러리를 작성하면 라이브러리를 사용하는 바이너리는 템플릿을 기반으로하는 함수를 생성합니다) –

+0

당신은 어떻게 생각합니까 : 정적 반사가 가능 해지면 이러한 모든 한계를 극복 할 수 있습니까? 아니면'clang' 인프라의 일부가 여기에서 도움이 될까요? – Orient