istream: mehrere Trennzeichen

13/05/2015 - 14:37 von Markus Donath | Report spam
Hallo,

Ich möchte Daten aus einem stream lesen á la:

wstring s(L"1:3.14:hello world!\tund tschüß...:-135.56");
wistringstream in(s);
int a;
float b;
std::wstring c;
double d;
in >> a >> b >> c >> d ;

Das Problem, ein anderes Trennzeichen als white spaces zu verwenden
konnte ich lösen durch:

template<typename charT, charT delim>
struct is_delim : std::ctype<charT>
{
bool do_is(mask m, char_type c) const
{
if ((m & space) && c == 9)
return false;
if ((m & space) && c == 32)
return false;
if ((m & space) && c == delim)
return true;
return ctype::do_is(m, c);
}
};

in.imbue(std::locale(in.getloc(), new is_delim<wchar_t, L':'>));

Im nàchsten Schritt würde ich gern eine beliebige Anzahl von
Trennzeichen zulassen.
Mein Versuch mit:

template<typename charT, charT* delims>
struct are_delims : std::ctype<charT>
...

geht leider nicht. (Ungültiger template-Parameter).

Vielleicht làsst es sich mit variadic templates machen, aber da finde
ich keinen Anfang.

Kann mir da jemand Hilfestellung geben?

Markus
 

Lesen sie die antworten

#1 Stefan Reuther
14/05/2015 - 09:33 | Warnen spam
Markus Donath wrote:
Im nàchsten Schritt würde ich gern eine beliebige Anzahl von
Trennzeichen zulassen.
Mein Versuch mit:

template<typename charT, charT* delims>
struct are_delims : std::ctype<charT>
...

geht leider nicht. (Ungültiger template-Parameter).



'charT*' sind halt nicht als Template-Parameter zugelassen.

Ich kenn mich mit locales nicht aus, aber: muss das denn ein
Templateparameter sein oder kann der 'charT*' nicht einfach ein ganz
normaler Instanzparameter sein, also

-8<--8<--8<-
template<typename charT>
struct are_delims : std::ctype<charT> {
const char* delims;
are_delims(const char* delims)
: delims(delims);
// ...
};
-8<--8<--8<-


Stefan

Ähnliche fragen