2011-09-17 12 views
3

テンプレート化された関数を使用してユーザーから入力を取得しようとしています。 int、double、float、およびstringsを入力できるようにしたい。だからここに私がこれまで持っているコードです:テンプレート関数を使用したさまざまなタイプの入力

template<class DataType> 
void getInput(string prompt, DataType& inputVar) 
{ 
     cout << prompt; 
     cin >> inputVar; 
} 

int main() 
{ 
     string s; 
     int i; 
     float f; 
     double d; 

     getInput("String: ", s); 
     getInput("Int: ", i); 
     getInput("Float: ", f); 
     getInput("Double: ", d); 

     cout << s << ' ' << i << ' ' << f << ' ' << d << endl; 
     return 0; 
} 

基本的なタイプのすべての作業は、私が持っている問題はstring秒を入力してあります。私は1つ以上の単語を入力できるようにしたいと思いますが、私がcinを使用しているという事実には私はできません。それで、入力した複数の単語の文字列も、私がやっているのと同様の方法で基本的な型を入力することができますか?

+0

cin.getline()を使用して、プログラム内の単語を分割することができます –

+0

しかし、int、float、およびdoubleを入力する機能が失われます。 – John

+0

私の答えを参照してください、2番目のリンクを使用することができます。 – evgeny

答えて

1

私は特別なケースの文字列が必要と考えています。 cinには1語しかないので、getline()を使って行全体を取得する必要があります。参考までにthis pageを参照してください。次に、適切に見えるように線を操作することができます:分割、解析、その他

残念ながら、それはライン全体を詰まらせ、"one two three 123 3.1415"のようなものがあれば、ライン全体が消費されます。

さらに数字/文字列/単語/浮動小数点数を判断するには、example hereを参照してください。しかし、それは完全にテンプレートを利用していません。

2

とにかく、プロンプトの後に入力バッファを残したくないと思うので、あなたはgetl​​ineを使いたいと思っています。ただし、文字列の動作のみを変更するには、テンプレートの特殊化を使用できます。

template<> 
void getInput(string prompt, string& inputVar) 
{ 
    cout << prompt; 
    getline(cin, inputVar); 
} 
+0

私の答えを削除しました。 – Johnsyweb

+0

それはトリックでした。さて、C++でのテンプレートの特殊化と関数のオーバーロードの処理方法の違いは何ですか? – John

+0

@John:http://www.gotw.ca/gotw/049.htm – Johnsyweb

2

過負荷stringする機能を(またはtemplate専門に行う):あなたのテンプレート関数の後。

void getInput(string prompt, string& inputVar) // <--- overloaded for 'string' 
{ 
    cout << prompt; 
    getline(cin, inputVar); //<-- special treatment for 'string' using getline() 
} 
0

これはあなたに予期しない結果をもたらす可能性があります。たとえば、あなたはこのように書きセッションを持つことができます:

String: Foo 12   3.14159 1.5 <enter> 
Int: Float: Double: Foo 12 3.14159 1.5 

を私はあなたが何をしたいのか、あなただけの例を挙げたが、これはほぼ確実ではありません知っています。 cinは、入力が押されるまで入力を決して登録しないので、getlineを使用して、行ごとに行を変えたいと思うでしょう。さもなければ、上記のように物事がファンキーになる

各キー押しにアクセスできたとしても、このインラインでは望み通りにできないようです。

関連する問題