는 가변 신호를 생성하고이 슬롯으로 일반 람다를 접속할 수있다? 내가 좋아하는 뭔가를 의미한다 (필요한 경우 말, 참여의 모든 기능 정의를 볼 수 있습니다 (예 : 인스턴스의 점)에서) 대신가변 인자 신호 및 일반 람다
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_tuple
과 std::index_sequence
의 내용을 포함 할 것이라는 것을 알고있다. 하지만 덜 자세한 솔루션입니까?
하는 것은 불가능합니다 'someSignal (...);'함수를 인스턴스화하는 모든 변형을 모으고 링크하기 전에 모든 해당 특수화를 생성 하시겠습니까? – Orient
아니요. 'moc'은 컴파일이 완료되기 전에 호출되며 Q_OBJECT 매크로가있는 파일 만 처리합니다. moc의 출력은 자신의 C++ 파일이 컴파일되는 동시에 컴파일되는 C++ 코드입니다. 그래서 링크 타임은 moc가 어떤 함수를 추가하기에는 너무 늦었다. 그러나 링크 시간도 너무 빨리 템플릿 함수의 사용 사례를 알 수 없습니다 (예 : 라이브러리를 작성하면 라이브러리를 사용하는 바이너리는 템플릿을 기반으로하는 함수를 생성합니다) –
당신은 어떻게 생각합니까 : 정적 반사가 가능 해지면 이러한 모든 한계를 극복 할 수 있습니까? 아니면'clang' 인프라의 일부가 여기에서 도움이 될까요? – Orient