2017-08-08 12 views
0

テンプレート付き関数を使用して数値のリスト(intまたはdouble)をベクトルに読み込む単一の関数を書くうまい方法があるのでしょうか?ここでテンプレート関数を使用してCSVファイルから数値を読み取る

は、私は通常、何をすべきかです:

template<class VecType> 
vector<VecType> read_vector(const string& file){ 
    vector<VecType> vec; 

    ifstream indata; 
    indata.open(file); 

    string line;  

    while (getline(indata, line)) { 
     stringstream lineStream(line); 
     string cell; 
     while (std::getline(lineStream, cell, ',')) { 
      vec.push_back(stod(cell)); 
     }   
    } 

    indata.close(); 

    return vec; 
} 

私の問題はstoiまたはstod一部です。これをうまく処理するにはどうすればいいですか?

私は通常何、stodを使用してVecTypeは、例えばintある場合、変換はdoubleからintに自動的に発生させることです。しかし、これを行うにはもっと良い方法があるはずですよね?あなたが専門的なテンプレート持つことができ

+0

を使用し、私の代わりに遅い – NULL

+1

方法である 'stringstream'のラインから' cells'を読み取るより良い方法をいただければと思います約 'VecType e; cellStream >> e; vec.push_back(e); '? – Jarod42

答えて

3

template <class T> T from_string(const std::string&); 

template <> int from_string<int>(const std::string& s) { return stoi(s); } 
template <> double from_string<double>(const std::string& s) { return stod(s); } 

とBTW vec.push_back(from_string<VecType>(cell));

+0

私は 'error:template-id 'from_string 'をプライマリテンプレートの宣言に入れています'と 'error: 'double'はテンプレートの非タイプパラメータの型ではありません'何が欠けていますか? – NULL

+0

私の一部からのタイプミス、 '<>'は空でなければなりません。 – Jarod42

+1

これは、デフォルトの特殊化に 'operator >>'を使用することで、任意の入力ストリーム可能型に拡張することもできます。 –

関連する問題