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.

War es hilfreich?

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 , die das Verhalten haben Sie wollen.

Wenn Sie Erhöhung dann verwenden boost :: lexical_cast .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top