2016-09-23 8 views
-1

デフォルトの引数が値を渡してメソッド/関数を処理するときの解決策を思いつきましたが、問題になるかどうかはわかりません。静的/大域変数をデフォルト引数として使用する

望ましい行動だけで値を指定することは十分にあり、デフォルトの引数として単一の値を持つことです。

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. */ } 
+1

、オーバーロードすることはるかに良いではありません引数が渡されない場合の関数?確かに、それは何をすべきかです。デフォルト値はデフォルト値であり、デフォルト動作ではありません。 –

+0

@GabrielVasconcelos私はあなたの意見を見ます。しかし、ポインタを受け取り、nullポインタが渡されたとき(例外を投げるだけではない)に別個の動作をする関数を見てきました。 [SDLのFillRect](https://wiki.libsdl.org/SDL_FillRect)関数は、2番目のパラメータにNULLを渡すとき、動作が少し異なります。 – Hydren

答えて

0

追加の署名

過負荷私はなぜyを理解していないそれはとても複雑にしたい。この機能のユーザーとして、私はそれが機能するとは思っていません。署名が

void foo(const type& arg=DEFAULT); 

されている場合は、私は、次の2つのコールが同等であることを期待する:

foo(); 
type x = DEFAULT; 
foo(x); 

問題は、参照のアドレスを取ることはありません。参照は元の変数のエイリアスです。問題は、値の代わりに変数DEFAULTが必要であることです。これは、たとえ関数が渡されたとしても、関数のパラメータがどのように働くかを示すものではありません。

Btwでは、上記の例はそれほど工夫されていません。パラメータをベクトルに入れて、ベクトルの各要素の関数を呼び出すとします。あなたの現在のアプローチでは、DEFAULTをベクトルの中に入れて、それを関数に渡すことはできません。実際それはさらに悪いです:私はそれをすることができますが、私が期待することはしません。

このparicular場合、私は単純に、このようにそれを実装します:

void foo(T arg = 0, bool generateRandom = true) { 
    T x; 
    if(generateRandom) x = generate_random(); 
    else x = arg; 

    // do something with x... 
} 

そして、それはこのように呼び出すことができますあなたの場合は

foo(3.5,false); // uses the value 
foo();   // generates a random value 
+0

DEFAULTという名前は単なる例でした。名前の衝突を避けるために選択できます。 – Hydren

+0

は「DEFAULTとして認識されません」。それは実際に意図されています。値を指定すると、ユーザーが値を指定したかのように動作します。 – Hydren

+0

@Hydrenよく、その後、私はスニペットを誤解しました。しかし、私はまだそれを複雑にしたい理由を理解していません。彼が関数に関数を使用させたい場合、ユーザーがランダムに生成された値を渡すようにするのはさらに簡単でしょうか?私がユーザーであれば、使用されたランダムな値を検査できるようにしたいと考えています。 – user463035818

関連する問題