2010-12-27 19 views
8

OK、C++でのCスタイル可変関数の使用について教えられる前に、他にもQt MOCの書き換えに何も必要ないことが分かっています。Qtとvariadic関数

私が知りたいのは、任意の量/タイプの引数を取る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(...))); 

、はい、私は最終的にはそれを自分自身を試してみましょう...しかし、私は誰か、既存た知識が、私は多分に私の時間を無駄にする前にタップすることができます期待していますそれ。


この質問はブースト::信号S2か、単に基本的な機能のような静的な信号にQtの信号を変換することができ、テンプレートオブジェクトのための「キャッチオール」基底クラスを設計する方法を見つけるための試みでした。私は、私はva_argsからパラメータを再構築するためにTMPを使用することができたバリデーショナルなテンプレートを取ったスロットを構築できると思った。問題への答えはそれほど正確でしたが、スロットがqtメカニズムによって呼び出される前にカットしました。

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

私の昔のブログの場所です:全体のことを行う方法についての記事のシリーズの最初の割賦は、私はこの問題の一部を解決する方法を紹介しました。あなたが他の奇妙な顔を見たいなら、新しい人物が私のプロフィールにあります。

+2

NVM、私は自分の質問に答えました。もちろん、Qtもこれを行うことはできません。 –

+1

型指定されていないスロットを持つことで、コンパイル時の型の安全性という言語の中核的な利点の1つを放棄します。 –

+2

フランク、フランク、フランク。 Qtはすでにそれを行っています。私は型の安全を取り戻そうとしています。これは1つの失敗した試みでした。最終的な成功の話は私のブログを参照してください(私のプロフィールにあります)。 –

答えて

2

私はそれを尋ねてからそれに答えてから数週間後、人々は依然として答えを掲示しているので、この質問はまだ答えが必要だと考えているように見えます。だから私は、質問自体とそれに対する最初のコメントの両方ではなく、明示的に回答にしなければならないと思います。

Qtの信号またはスロットとしては使用できません。

問題を解決して共有するだけでなく、問題が解決された方法を説明するだけでなく、多くの時間と労力を費やしました。読んでみてください、新しいことを学ぶかもしれません。

+1

あなた自身の質問に答えるのはSO上では問題ありません;) –

1

この問題を解決するためにすべてが醜いですが、あなたはすべての重労働を自分自身で行う必要はありません。引数タイプとしてboost::anyまたはboost::variantを使用し、必要な引数を含むようにオブジェクトをロールバックするか、任意の/バリアント型のベクトルを使用します。

QVariantを使うこともできますが、boost :: variantと同じくらいうまくやっていません。

(あるいはboost :: signalsやtrX :: variantを使ってQtを書き直すだけですが、私たちは現在21世紀に住んでいます)また、信号/スロットの状態 - boost :: signalsが使用するC++の機能は、Trolltechがシグナル/スロットの実装を開発したときにC++コンパイラによって一般的にサポートされていませんでした。

-1

"..."構文は、C++が "..."構文を拡張するのに悩まされなかったので、 "本当の"オブジェクトを受け取ることはできません。

これは実際には、あなたのケースでは良いニュースです。これは、次の提案が実際にあなたのオブジェクトを自動破壊することを心配することなくあなたのために実際に働く可能性があるからです。

あなたができることは、コンストラクタが "..."を取る単純なオブジェクトを作成することです。それは動的に割り当てられた配列にそれらをダンプする、その引数を歩くでしょう。その後、その単一のオブジェクトをスロットに渡すことができます。

あなたが怠惰なタイピストであり、そのオブジェクトV(バリアント型またはバリデーション型など)を呼び出したとしましょう。そして、あなたはこのようにVを取る関数呼び出すことができます。もちろん

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

を、すべての呼び出し側は、おそらくあなたが望んでいたまさにされていない、手でVを構築する必要があります。

+0

私はこれを投票しませんでしたが、 "オブジェクトを自動的に破壊するC++について心配する必要はありません"というのはかなり危険な声明です。それ以外の場合は、私はほとんどの部分に同意します。デストラクタを持つC++オブジェクトは自動的に破棄されるはずです。それを持たないことは、言語の基本的な仕組みをバイパスしていることです。 – stinky472

関連する問題