template argumentenliste
-
hallo leute
hab folgenden code:
template<class CHAR, class TRAITS> class basic_inserter { public: basic_inserter(std::basic_istream<char_type, traits_type> &in) : m_stream(in) { } };jetzt bin ich irgendwie auf den trichter gekommen, das wenn ich folgendes mache:
basic_inserter ins(std::cin);das er selber rausfindet was CHAR und TRAITS fuer typen sind.
scheint aber nicht so zu sein.
wie kann ich das nun bewerkstelligen, das ich bei der konstruktion nicht die template parameter mitangeben muss ?
bei einem selbst gebastelten stream, muesste ich sonst zu erst nachgucken welcher CHAR und welche TRAITS verwendet werden.Meep Meep
-
Wie immer in C++: Das löst man mit Workarounds.
template<class CHAR, class TRAITS> class basic_inserter { public: basic_inserter(std::basic_istream<char_type, traits_type> &in) : m_stream(in) { } }; template<class CHAR, class TRAITS> basic_inserter<CHAR, TRAITS> make_back_inserter(std::basic_istream<char_type, traits_type> &in) { return basic_inserter<CHAR, TRAITS>(in); } // dann: auto ins = make_basic_inserter ins(std::cin);
-
danke fuer den workaround
basic_inserter ist die basisklasse fuer ne reihe von inserterklassen.
dann muesste ich fuer jede weitere klasse die ich erstelle immer so einen workaround schreiben.+gefaellt mir nicht so sonderlich gut.gibts da auch noch nen workaround ?
Meep Meep
-
hab da einen großen designfehler gehabt.
hab das mal umgestrickt und lass fuer TRAITS mal std::basic_istream<CHAR>::traits_type einsetzen.noch ne andere frage:
muesstedecltype(std::cin)::char_type c='C';das nicht zu
char c='C';aufgeloest werden ?
bekomme in VS2012 folgenden fehler:error C2039: 'char_type': Ist kein Element von '`global namespace''Meep Meep
-
Meep Meep schrieb:
gibts da auch noch nen workaround ?
Nichts mir bekanntes. Auf C++1y warten.
Meep Meep schrieb:
noch ne andere frage:
muesstedecltype(std::cin)::char_type c='C';das nicht zu
char c='C';aufgeloest werden ?
decltype() erlaubt das nicht. Auf C++1y warten. Oder Workaround benutzen:
// A std::decay<decltype(std::cin)>::type::char_type; // B identity<decltype(std::cin)>::type::char_type; // C template <typename T> struct stream_trait { typedef typename T::char_type char_type; }; stream_trait<decltype(std::cin)>::char_type;
-
Meep Meep schrieb:
muesste
decltype(std::cin)::char_type c='C';das nicht zu
char c='C';aufgeloest werden ?
ja
Meep Meep schrieb:
bekomme in VS2012 folgenden fehler:
error C2039: 'char_type': Ist kein Element von '`global namespace''bug
-
N3337 schrieb:
nested-name-specifier:
- [...]
- decltype-specifier::
Ist also legal.
-