文字列全体を読むためにはstd ::にstringstream演算子を>>強制的にどのように?
-
16-09-2019 - |
質問
の代わりに最初の空白で停止の文字列全体を読むためにはstd ::にstringstream演算子を>>強制するには?
私は、テキストファイルから読み取られた値を格納するテンプレートクラスを持っています
template <typename T>
class ValueContainer
{
protected:
T m_value;
public:
/* ... */
virtual void fromString(std::string & str)
{
std::stringstream ss;
ss << str;
ss >> m_value;
}
/* ... */
};
私は、設定/設定解除ストリームフラグを試みたが、それは助けにはならなかった。
を明確化の
クラスは、テンプレートの1つのインスタンスが、それはまた、同様に他のタイプをサポートする必要がありれる型T.文字列への/からの自動変換を有する容器のテンプレートです。私がのstd :: getlineのの行動を模倣するために>>演算子を強制したい理由がある。
解決
オペレータは>> Tは=文字列、我々は[T =文字列]の場合の具体的な関数を書くことができ、当社の要件を満たしていないとして。これは、正しい解決策ではないかもしれません。しかし、作品としての周りに言及しています。
それはあなたの条件を満たしてない場合は、私を修正してください。
私は以下のようにサンプルコードを書かれています:
#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;
}
他のヒント
ここでは解決されます:
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 ++ニュースグループの元のポスターのおかげで)
どこでそれを停止したいのですか?あなたは全体のラインを読みたい場合は、必要がある場合、あなたはおそらく、のgetline の機能を必要としますstreamstringに保存されている文字列全体は、あなたの一品オブジェクト ostringstream :: strのの方法です。
私はあなたがT = std::string
とそのテンプレートをインスタンス化していると仮定しています。その場合、あなたはのgetlineを使用することができます:
getline(ss, m_value, '\0');
しかし、これはあなたが文字列の有効な部品としてNUL-文字を受け付けません想定しています。
そうでなければ、 `T」のために、独自の抽出を書くことができます。
私は除外書いて、あなた自身のファセットの承知している事業者との双方向>>ありません(演算子>>最初の文字で停止したisspace(Cのために、getlocは())が真です)。しかし、あなたが望む行動を持っている<文字列>でのgetline関数があります。
あなたが使用できる場合は <のhref = "http://www.boost.org/docを使用し、その後を後押し/libs/1_48_0/doc/html/boost_lexical_cast.html」のrel = "" nofollowを>ブースト:: lexical_castはこちらます。