2010-12-27 5 views
8

좋아요, C++의 C 스타일 가변 함수 사용법을 강의하기 전에 ... Qt MOC을 다시 작성하는 데 필요한 모든 것이 필요하지 않습니다.Qt와 가변 함수

내가 알고 싶은 것은 당신이 임의의 양/유형의 인수를 취하는 Qt 객체에서 "슬롯"을 가질 수 있는지 여부입니다. 것은 임의의 서명 슬롯을 가진 Qt 객체를 생성 할 수 있기를 정말로 원합니다. MOC는 표준 전처리 및 템플릿과 호환되지 않기 때문에 직접 접근 방식으로는 불가능합니다. ,

struct funky_base : QObject 
{ 
    Q_OBJECT 
    funky_base(QObject * o = 0); 

public slots: 
    virtual void the_slot(...) = 0; 
}; 

당신이 그것을 새로운 Qt는 물건을 선언하지 않는 한 너무 오래 QObject를 파생 객체의 하위 클래스 템플릿을 만들 수 있기 때문에이 후, 가능하다면 : 난 그냥 또 다른 아이디어를 내놓았다 내가 ... 물건을 소요 적절한 유형의 것으로 파생 템플릿 형식 파생 구현할 수 있어야합니다.

만약 그렇다면 어떻게 연결하나요? 이게 효과가 있니? 아무도이 미친 아무것도 시도하지있어 손을 모른다면

connect(x, SIGNAL(someSignal(int)), y, SLOT(the_slot(...))); 

, 그래 난 결국 그것을 자신을 시도 할 것이다 ...하지만 누군가 이미 존재하고있다 지식 나는 아마도 내 시간을 낭비하기 전에 활용할 수 바라고 그것.


이 질문은 정적 부스트와 같은 신호 :: signals2하거나 기본 기능에 Qt는 신호를 변환 할 수있는 템플릿 개체의 '캐치 올'기본 클래스를 디자인 할 수있는 방법을 찾기위한 시도였다. 가변성 템플릿을 사용하는 슬롯을 만들 수 있다면 va_args에서 매개 변수를 재구성하기 위해 TMP를 사용할 수 있다고 생각했습니다. 문제에 대한 대답은 거의 정확하게 그랬지만 슬롯이 qt 메커니즘에 의해 호출되기 전에 잘라 버렸습니다. 나의 오래된 블로그 위치의

http://crazyeddiecpp.blogspot.com/2011/01/quest-for-sane-signals-in-qt-step-1.html

: 나는 문제의이 부분을 해결하는 방법 전체를 만드는 방법에 대한 기사 시리즈의 첫 번째 할부가 나타났다. 당신이 다른 이상한 표정을보고 싶다면 새로운 프로필이 내 프로필에 있습니다.

+2

NVM, 나는 내 자신의 질문에 대답했다. 물론 Qt도이 작업을 수행 할 수 없습니다. –

+1

타입이 지정되지 않은 슬롯을 사용하면 언어의 핵심 이점 중 하나 인 컴파일 타임 타입 안전을 제공 할 수 있습니다. –

+2

프랭크, 프랭크, 프랭크. Qt는 이미 그렇게했습니다. 나는 형식 안전성을 다시 얻으려고 노력하고있다. 이것은 하나의 실패한 시도였습니다. 궁극적 인 성공 사례를 보려면 내 블로그를 참조하십시오 (내 프로필에 있습니다). –

답변

2

분명히 사람들은이 질문에 답할 필요가 있다고 생각합니다. 몇 주 후에 내가 물어 본 다음 나 자신에게 답변을했기 때문에 사람들은 여전히 ​​자신의 답변을 게시하고 있기 때문입니다. 그래서 나는 질문 자체와 그것에 대한 첫 번째 주석 대신 명시 적으로 답을 만들어야한다고 생각합니다 :

Qt에서 신호 또는 슬롯으로 사용할 수 없습니다.

나는 문제를 해결하고 공유하는 것뿐만 아니라 문제가 어떻게 해결되었는지 설명하는 데 많은 시간과 노력을 쏟았다. 독서를 고려해보십시오. 새로운 것을 배울 수도 있습니다.

+1

당신의 질문에 대답하는 것은 너무 문제가되지 않습니다;) –

1

이 문제를 해결하기위한 모든 것이 못 생길 것입니다.하지만 힘든 일을 모두하지 않아도됩니다. 인수 유형으로 boost::any 또는 boost::variant을 사용하고 필요한 인수를 포함하도록 객체를 굴립니다 (또는 임의의/변형 유형의 벡터 사용).

QVariant를 사용할 수도 있지만 boost :: variant만큼 좋지는 않으며 boost :: any만큼 유연하지는 않습니다.

(또는 boost :: signals 또는 trX :: variant로 Qt를 재 작성하십시오. 현재 21 세기에 살고 있기 때문에) Qt 개발자의 신호/슬롯 상태에 대해서는 너무 많이하지 마십시오. - boost :: signals에서 사용하는 C++ 기능은 Trolltech이 신호/슬롯 구현을 개발했을 때 일반적으로 C++ 컴파일러에서 지원되지 않았습니다.

-1

"..."구문은 "..."구문을 확장하지 않으므로 "실제"개체를 가져올 수 없습니다.

사실 그것은 다음과 같은 제안이 실제로 C++ 객체를 자동으로 파괴하는 것에 대해 걱정할 필요가 없기 때문에 실제로 좋은 소식입니다.

당신이 할 수있는 것은 생성자가 "..."을 취하는 간단한 개체를 만드는 것입니다.인수를 통해 동적으로 할당 된 배열로 덤프합니다. 그런 다음 그 단일 객체를 슬롯에 전달할 수 있습니다.

당신이 게으른 타이피스트이고 그 객체를 V (variant 또는 variadic 또는 무엇이든)라고 부른다고 가정 해 봅시다. 그런 다음 다음과 같이 V를받는 함수 호출 할 수 물론

function(V("one", "two", "three", NULL)); 

를 모든 발신자는 아마 당신이 바라고 정확히하지 않은 손으로 V를 구성해야합니다.

+0

나는 이것을 투표하지는 않았지만 "C++에 대해 객체를 자동 파괴하는 것에 대해 걱정할 필요가 없다"는 것은 다소 위험한 진술이다. 그렇지 않으면 나는 대부분 동의한다. 소멸자가있는 C++ 객체는 자동으로 삭제됩니다. 그렇게하지 않으면 언어의 기본 메커니즘을 우회하는 것입니다. – stinky472