4

回答が含まれるべき正しいタイプのデータがユーザーに割り当てられているかどうかを確認するテンプレート関数を作成しています。次に例を示します。

int main(){

    int E;
    cout<<"Enter an integer: "<<endl;
    E = clear_and_read<int>(cin);
    cout<<E<<endl;

}

ここで、関数clear_and_readは次のように定義されます。

template <class T> T clear_and_read(istream& inputstream){
    cin.sync();//removes anything still in cin stream
    cin.clear();
    T input;
    inputstream>>input;       
    while(inputstream.fail()){
        cout<<endl<<"Please ensure you are inputting correct data type. Suggested data type: "<< typeid(input).name() <<"."<<endl;
        cin.sync();
        cin.clear();
        inputstream>>input;  
    }
    return input;
}

stringこれで、の代わりに入力しようとすると機能しますintegerが、入力するdoubleと最初の値が割り当てられます。たとえば、5.678は5になります。

doubleテンプレート関数内で、aが読み込まれている場合にフラグを立てるために何ができintますか?

4

2 に答える 2

3

私はあなたが持っているものとは少し違うテイクを試してみます。具体的には、入力ストリームのエラー状態を変更しようとはしません。

// Untested
template <class T> T clear_and_read(istream& inputstream) {
  std::string inputString;
  while(1) {
    try {

      // Grab one maximally-sized whitespace-delimited chunk of input
      inputstream >> inputString;

      // Note: lexical_cast throws if there are any extraneous characters.
      return boost::lexical_cast<T>(inputString);

    } catch (boost::bad_cast&) {
      std::cout << "\nPlease ensure you are inputting correct data type. Suggested data type: "<< typeid(input).name() <<".\n";
    }
  }
}


:コンパイル環境で使用可能なブーストがない場合は、lexical_cast自分で実装するのはかなり簡単です。行き詰まったら、助けを求めてください。


参照:


編集これは完全にテストされたバージョンで、Boostに依存していません。

#include <exception>
#include <sstream>
#include <string>
#include <iostream>
#include <typeinfo>

template <class T> T clear_and_read(std::istream& inputstream) {
  std::string inputString;
  while(inputstream) {
      // Grab one maximally-sized whitespace-delimited chunk of input
      inputstream >> inputString;
      std::istringstream itemstream(inputString);

      // Convert it:
      T t;
      itemstream >> t;

      // See if conversion worked and consumed everything
      if(itemstream && (itemstream.get() == EOF)) {
        // SUCCESS
        return t;
      }

      // oops
      std::cout << "\nPlease ensure you are inputting correct data type. Suggested data type: "<< typeid(T).name() <<".\n";
  }
  std::cout << "What to do with EOF?\n";
  return T();
}

int main () {
  clear_and_read<int>(std::cin);
  clear_and_read<double>(std::cin);
}
于 2012-04-24T16:20:40.600 に答える
1

inputstreamの入力全体が消費されているかどうかを確認する必要があります。演算子>>は、最初の非数字に遭遇するたびに整数への変換を停止します。同様に、「3.14qwe」は3.14doubleに変換されます。

于 2012-04-24T16:18:57.997 に答える