2017-08-06 12 views
0

エラーハンドリングで安全な入力を生成する関数を用意していますので、数値(int)を入力するのがよりクリーンです。しかし、私は引数の1つが、必要な変数入力の境界を含む長さ2のオプションの配列であることを望みます。ここで引数として特定の大きさの配列を渡すには?

は、私が今のところ持っているものです。

//function prototype 
void input_number(int* variable, string text = "Input : ", int boundaries[2] = NULL); 

//function call 
int variable; 
input_number(&variable, "Choose a number between 0 and 10 : ", {0, 10}); 

これは私が関数に長さ2の配列を渡すことができますどのようにエラーにcannot convert '<brace-enclosed initializer list>' to 'int*' for argument '3' to 'void input_number(int*, std::__cxx11::string, int*)'

を投げ、動作しませんか?

また、int[] = NULLはデフォルトの配列値に合っていますか、まったく間違っていますか?

答えて

2

エラーメッセージは、問題を説明する - 関数の引数として渡される配列は、(最初​​の要素への)ポインタに変換されます。

2つのメンバーを持つstructタイプを渡して、デフォルト値を与えることが1つの解決策です。 std::arrayが実際しかしながら鋳型構造

void input_number(int* variable, std::string text = "Input : ", const std::array<int, 2> &bounds = {}); 

int variable; 
input_number(&variable, "Choose a number between 0 and 10 : ", {0, 10}); 

、2つの値を格納することができ、及びinitializer_list<int>を用いて構築され、任意のデータ構造であるので、例は、あろう。そのようなタイプの他の例が標準ライブラリにあります - std::arrayだけではありません。

個人的に、私はまた、最初の引数を省略し、これよりも、例外をスローすることによって機能が他のエラーを(報告することができないという問題がある

int input_number(std::string text = "Input : ", const std::array<int, 2> &bounds = {}); 

// to call 

int variable = input_number("Choose a number between 0 and 10 : ", {0, 10}); 

戻り値としてそれを持っていると思います)しかし、あなたのアプローチもそうです。

個人的には、デフォルトの引数として境界を渡すこともありません。私は単に関数のオーバーロードでそれを行うだろう。 (範囲を指定)

int input_number(std::string input, int lower_bound, int upper_bound) 
{ 
    // do whatever you want 
} 

int input_number(std::string input) 
{ 
     return input_number(input, std::numeric_limits<int>::min(), std::numeric_limits<int>::max()); 
} 
(場合は、デフォルトの境界が使用されている)第一の後、引数を提供しないするか、発信者を強制

、又は二 - 唯一つの追加の引数を渡すことは診断可能エラーであろう。あなたが尋ねたこととの唯一の違いは、関数を呼び出すための配列やその他のデータ構造を(暗黙的または明示的に)構築する必要がないことです。

+0

詳細な回答ありがとうございます!余分な提案がたくさんある、私はそれが大好きです。そして、はい、私は関数のオーバーロードを避けたい場合でも、私は間違いなくそれらを使用する以外の選択肢がないと思います! – lolgab123

+0

あなたはちょうど過負荷がオーバーロードせずにより多くのスペースを取っていないと書いた方法で、ちょうど読んで..非常に素晴らしいソリューションありがとう! (+最後のコードブロックに余分な閉じ括弧があり、入力直後に削除される可能性があります) – lolgab123

2

は、これを試してください

void input_number(int* variable, string text = "Input : ", std::array<int, 2> boundaries = {}); 
+0

配列をconst&とすることもお勧めしますが、それはその時点での設定です。ほんの数多くのユースケースを開くだけです。 – TheKitchenSink

+0

この場合は何も得ません@TheKitchenSink。エラーメッセージに基づいて、Askerは呼び出し中に '{}'を使用しているように見えます。 – user4581301

+0

残念ながら{}は「配列なし」を意味するものではなく、「0で埋められた配列」を意味します。 –

関連する問題