デフォルトの引数が値を渡してメソッド/関数を処理するときの解決策を思いつきましたが、問題になるかどうかはわかりません。静的/大域変数をデフォルト引数として使用する
望ましい行動だけで値を指定することは十分にあり、デフォルトの引数として単一の値を持つことです。
void foo(type arg=value)
{
//do something using arg...
}
しかし、望ましい行動とは、例えば、ランダムな値を生成行うことです、物事異なる。この場合、ランダムな値を生成するために、私は与えられた解を思いつきました:
static type DEFAULT = /* value */; //static is optional, DEFAULT can be any name.
void foo(const type& arg=DEFAULT)
{
type x;
if(&arg == &DEFAULT)
x = generate_random();
else x = arg;
// also we could use a ternary like
// type x = (&arg == &DEFAULT? generate_random() : arg)
// do something with x...
}
このアプローチを使うことには何か欠点がありますか?参照のアドレスと与えられたデフォルトの引数のアドレスを安全に比較できるか?これはメソッドや静的クラス変数でも動作しますか?
いくつかの他のソリューションは、以下のとおりです。ヌルで引数
void foo(){ /* do something using a random value */ }
void foo(type arg){ /* do something using arg... */ }
それともポインタ代わりに、デフォルト:
void foo(type* arg=null) { /* if arg is null, generate value. */ }
、オーバーロードすることはるかに良いではありません引数が渡されない場合の関数?確かに、それは何をすべきかです。デフォルト値はデフォルト値であり、デフォルト動作ではありません。 –
@GabrielVasconcelos私はあなたの意見を見ます。しかし、ポインタを受け取り、nullポインタが渡されたとき(例外を投げるだけではない)に別個の動作をする関数を見てきました。 [SDLのFillRect](https://wiki.libsdl.org/SDL_FillRect)関数は、2番目のパラメータにNULLを渡すとき、動作が少し異なります。 – Hydren