私はこれを達成したい:
- second parameter by default set to first argument
何かのようなもの:
int foo (int a, int b = a);
しかし、それを行う方法は?
どうもありがとう!
私はこれを達成したい:
- second parameter by default set to first argument
何かのようなもの:
int foo (int a, int b = a);
しかし、それを行う方法は?
どうもありがとう!
これは次の方法で禁止されています。
9)デフォルトの引数は、関数が呼び出されるたびに評価されます。関数の引数の評価の順序は指定されていません。 したがって、関数のパラメーターは、評価されない場合でも、デフォルトの引数式で使用されないものとします。デフォルトの引数式の前に宣言された関数のパラメーターはスコープ内にあり、名前空間とクラスメンバー名を非表示にすることができます。[ 例:
int a;
int f(int a , int b = a); / / error: parameter a
/ / used as default argument
typedef int I;
int g( float I , int b = I (2)); / / error: parameter I found
int h(int a , int b = sizeof (a )); / / error, parameter a used
/ / in default argument
—例を終了]
別の方法はオーバーロードです。
int foo(int a, int b);
int foo(int a)
{
return foo(a,a);
}
これが許可されない理由はすでに対処されていますが、@ Vyktorの方針に沿った別の解決策はboost::optional
、マジックナンバーの代わりに使用することです(これには、オーバーロードの作成と比較して長所と短所があります)。
int foo(int a, boost::optional<int> b = boost::none)
{
if(!b) b = a;
}
Luchian Grigoreが提案したように、この特定のタスクにはオーバーロードを使用することをお勧めしますが、一般的な方法は、「これがデフォルトです」と言う値を予約することです。例えば
int foo( int a, int b = -1)
{
if( b == -1){
b = a;
}
}
オブジェクト(スカラー値ではない)を使用すると、これは(デフォルト値を表すために予約された新しい配信クラスを作成することによって)非常にうまく実装できますが、intではこれを行う必要があります。
値(または予約された値)をb
取得できないことを100%確認する必要があることに注意してください。-1
これは少し面白い答えですが、機能します:
#define TWO_FROM_ONE(a) (a),(a)
f(TWO_FROM_ONE(12));
1つの欠点は、これが一部の関数を2回呼び出すことです(既知のマクロの欠点)。
f(TWO_FROM_ONE(sin(123 / PI)));