私は(それが起こるように、テキストゲーム、)いくつかの古いコードと協力し、よりよい何かをパターン可変個引数の文字列の比較
strcasecmp(variable, "something") == 0 || strcasecmp(variable, "something else") == 0
を交換したかった、
in_list(variable, "something", "something else")
ように私は思いました。可変的な機能が適切であろう。しかし、私がマンページを見ると、引数が足りなくなったときを知らせる方法がないことがわかりました(定義されていない動作の結果があるときはva_arg
と呼んでいます)。だから私はこれをどう扱うことができますか?
多分、この制限を回避する方法があります。たぶん私は#define
リストの最後にいくつかの種類のセンチネルがありますので、私はそれをチェックすることができますが、それは控えめなようです。私はちょうどそれがハックのように感じるが、私はちょうど1つ、2、...引数をいくつかの合理的な制限まで、マクロの家族とそれを置き換えることができると思います。
これは正しい方法はありますか? string
タイプを使用するようにプログラムを書き直すつもりはなく、私はchar*
で止まっているとします。
in_list(variable, {"something", "something else", "yet a third thing"});
編集:あなたがC++ 11個の機能を使用することができますのようなものを使用することができますので、私は、関数が初期化子リストをサポートコレクション型(例えば、std::set
)を取る必要があるだろうと仮定し
'char *'で「固まっている」場合は、明らかにセンチネル値 - NULLです。 ( 'std :: set'ソリューションははるかにクリーンで簡単ですが) –