Wie zwingen std :: string Operator >> eine ganze Zeichenfolge zu lesen?
-
16-09-2019 - |
Frage
Wie zwingen, std :: string Operator >> eine ganze Zeichenfolge anstelle des Anhaltens am ersten Leerzeichen zu lesen?
Ich habe eine Template-Klasse bekommt, die einen Wert aus einer Textdatei lesen speichert:
template <typename T>
class ValueContainer
{
protected:
T m_value;
public:
/* ... */
virtual void fromString(std::string & str)
{
std::stringstream ss;
ss << str;
ss >> m_value;
}
/* ... */
};
Ich habe versucht, Scharf- / Unscharfschaltung Strom Fahnen, aber es hat nicht geholfen.
Klarstellung
Die Klasse ist eine Container-Vorlage mit automatischer Konvertierung zum / vom Typ T. Strings ist nur eine Instanz der Vorlage, es muss auch auch andere Arten unterstützen. Deshalb habe ich zwingen Betreiber wollen >> das Verhalten von std :: getline zu imitieren.
Lösung
Als Betreiber >> ist nicht unsere Anforderung erfüllt, wenn T = string, können wir eine bestimmte Funktion für [T = string] Fall schreiben. Dies kann nicht die richtige Lösung sein. Aber als Arbeit um erwähnt haben.
Bitte korrigieren Sie mich, wenn es nicht Ihre Anforderung erfüllen.
Ich habe einen Beispielcode, wie unten geschrieben:
#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;
}
Andere Tipps
Hier ist eine Lösung:
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;
}
(Dank der Original-Poster in C ++ Newsgroup)
Wo wollen Sie es stoppen? Wenn Sie eine ganze Zeile zu lesen, müssen Sie wahrscheinlich getline Funktion, wenn Sie ein gesamte Zeichenfolge im streamstring gespeichert Objekt Ihrer Wahl ist ostringstream :: str Methode.
Ich gehe davon aus Sie diese Vorlage mit T = std::string
sind instanziieren. In diesem Fall könnten Sie getline verwenden:
getline(ss, m_value, '\0');
Dies ist jedoch vorausgesetzt, dass Sie nicht nul-Zeichen als gültige Teile der Zeichenfolge akzeptieren.
Ansonsten können Sie Ihre eigene Extraktor für `T‘ schreiben.
Es gibt keine Art und Weise mit Operator >>, dass ich freigestellter bewusst bin Ihre eigene Facette schriftlich (Operator >> auf dem ersten Zeichen zu stoppen, für die isspace (c, getloc ()) wahr ist). Aber es gibt eine getline Funktion in
Wenn Sie Erhöhung dann verwenden boost :: lexical_cast .