2011-01-06 10 views
2

かなりシンプルな質問私は思うが、ウェブ上のどこからでもそれに関する議論を見つけるのが難しい。私はトリプルドットを何年も何度も関数のパラメーターとして見てきました。そして、私はいつも、それが "あなたがここにとどまるもの"を意味すると思っていました。昨夜まで、私はそれらと関数をコンパイルしようと決めました。私の驚いたことに、それはMSVC2010で警告またはエラーなしでコンパイルされました。それとも、少なくとも、それは登場しました。私は本当にわからないので、私はここで尋ねると思った。仮想ボイドfoo(...)の "..."の意味は?= 0 ;?

答えて

7

これらはva_argsまたは可変数の引数です。たとえば、

+3

真。彼らはCの時代からの古いハックであり、型の安全性の欠如のためにC++では本当に推奨されていないことに注意してください。つまり、彼らの用途はありますが、通常はC++の機能でより良い選択肢を見つけることができます。 (btw、mic?gamedev.plからのマイク) – Kos

+1

を除いて、すべての例外を「キャッチ」したいという怠け者を除いて! ;) – Nim

+0

絶対に、個人的に私は常にそれらを避けようとします。そして、いいえ、私はgamedev.plからマイクではありません。 – Mic

1

と呼ばれます。基本的に、この関数は任意の数の非クラス型の引数を受け入れます。

4

トリプルドットは、機能がvariadicである(つまり、可変数のパラメータを受け入れる)ことを意味します。しかし、使用するには少なくともパラメータが必要です。ただ "..."を持つことは、使用可能な移植可能宣言ではありません。

ときどきバリデーション関数の宣言は、オーバーロードの解決の優先順位のためだけに使用されます(つまり、特定のテンプレートインスタンス化が失敗または成功するように宣言されている場合、バリデーション関数自体は実装されません)。このテクニックの名前はSubstitution failure is not an error (SFINAE)です。

+1

[SFINAE](http://en.wikipedia.org/wiki/SFINAE)の様々なアプリケーションは、後者が使われる場所です。 –

+0

回答ありがとうございました。私はこの種のハンドウォーキング技術の大ファンではありませんが、確かに人気があります。 – 6502

0

これは、引数の型とその数が指定されていないことを意味します。あなたがよく知っている具体的な例は、printf(char *, ...)

のようになります。もしprintfを使うなら、フォーマット文字列の後に好きなものを置くことができ、コンパイラによって強制されません。

printf("%s:%s",8)は、 "expected"引数が与えられた場合と全く同じようにコンパイラを経由します。printf("%s:%s", "stringA", "stringB")

実際に必要でない限り、コンパイル時に実行時エラーが発生する可能性があるため、避けてください。あなたの関数が受け入れることができる引数に有限の、列挙可能なバリエーションがある場合は、オーバーロードによってそれらを列挙することをお勧めします。

関連する問題