7

std::stringstream operator >> に最初の空白で停止するのではなく、文字列全体を強制的に読み取る方法は?

テキスト ファイルから読み取った値を格納するテンプレート クラスがあります。

template <typename T>
class ValueContainer
{
protected:
  T m_value;

public:
  /* ... */
  virtual void fromString(std::string & str)
  {
    std::stringstream ss;
    ss << str;
    ss >> m_value;
  }
  /* ... */
};

ストリーム フラグの設定/設定解除を試みましたが、役に立ちませんでした。

明確化

このクラスは、型 T との間の自動変換を備えたコンテナー テンプレートです。文字列はテンプレートの 1 つのインスタンスにすぎず、他の型もサポートする必要があります。そのため、演算子 >> に std::getline の動作を模倣させたいのです。

4

6 に答える 6

6

T=string の場合、演算子 >> は要件を満たさないため、[T=string] の場合に特定の関数を記述できます。これは正しい解決策ではない可能性があります。しかし、回避策として述べたように。

要件を満たさない場合は修正してください。

以下のようにサンプルコードを書きました。

#include <iostream>
#include <sstream>
#include <string>

using namespace std;

template <class T>
class Data
{
    T m_value;
    public:
    void set(const T& val);
    T& get();
};

template <class T>
void Data<T>::set(const T& val)
{
    stringstream ss;
    ss << val;
    ss >> m_value;
}

void Data<string>::set(const string& val)
{
    m_value = val;
}

template <class T>
T& Data<T>::get()
{
    return m_value;
}

int main()
{
    Data<int> d;
    d.set(10);
    cout << d.get() << endl;

    Data<float> f;
    f.set(10.33);
    cout << f.get() << endl;

    Data<string> s;
    s.set(string("This is problem"));
    cout << s.get() << endl;
}
于 2009-07-16T12:17:44.150 に答える
5

ここに解決策があります:

std::istream & ReadIntoString (std::istream & istr, std::string & str) 
{ 
    std::istreambuf_iterator<char> it(istr), end; 
    std::copy(it, end, std::inserter(str, str.begin())); 
    return istr; 
} 

(C++ ニュースグループの元のポスターに感謝します)

于 2009-07-16T09:53:05.193 に答える
2

どこで止めたいですか?行全体を読みたい場合は、おそらくgetline関数が必要です。streamstring オブジェクトに格納されている文字列全体が必要な場合は、ostringstream::strメソッドを選択してください。

于 2009-07-16T09:19:57.413 に答える
1

でそのテンプレートをインスタンス化していると仮定していますT = std::string。その場合、getline を使用できます。

getline(ss, m_value, '\0');

ただし、これは、ヌル文字を文字列の有効な部分として受け入れないことを前提としています。

それ以外の場合は、`T' 用の独自のエクストラクタを作成できます。

于 2009-07-16T09:20:15.540 に答える
1

独自のファセットを記述することを除いて、私が知っている operator>> の方法はありません (operator>> isspace(c, getloc()) が true である最初の文字で停止します)。しかし、 <string> には、必要な動作を持つ getline 関数があります。

于 2009-07-16T09:16:32.053 に答える
1

Boostを使用できる場合は、 boost::lexical_castを使用してください。

于 2011-11-24T07:51:31.107 に答える