for_each, function, pointer
-
hi wie schreibe ich
auto mtypeIt=mvecTypes.begin(); while (mtypeIt!=mvecTypes.end()) { (*mtypeIt)->WriteSymbol(std::cout); ++mtypeIt; }mit der stl?
habs versucht mit
std::for_each(mvecTypes.begin(), mvecTypes.end(), std::bind(&CVarSymbol::WriteSymbol(std::cout));allerdings funktioniert es nicht weil ich ja einen parameter übergebe
-
std::for_each(mvecTypes.begin(), mvecTypes.end(), std::bind(&CVarSymbol::WriteSymbol, std::placeholders::_1, std::ref(cout));ungetestet...
-
eine klammer fehlt noch am ende aber sonst funktioniert es
dank dir

-
Deutlich schöner:
for( auto ptr : mvecTypes ) ptr->WriteSymbol(std::cout);
-
Wäre das hier nicht noch viel toller?
for( auto ptr : mvecTypes ) std::cout << ptr->GetSymbol();
-
Das wäre toll:
std::copy(mvecTypes.begin(), mvecTypes.end(), std::ostream_iterator<CVarSymbol>(std::cout));bzw. richtig toll wäre, wenn C++14 das hier erlauben würde:
std::copy(mvecTypes.begin(), mvecTypes.end(), std::ostream_iterator(std::cout));
-
Oder wirklich ganz ganz toll:
std::copy(mvecTypes, std::ostream_iterator<>(std::cout));
-
3 mal darfste raten wer für letzteres eine Lösung anbietet...
(gut ohne die Typerkennung beim iterator)
-
Da braucht man nicht raten. Boost.Range kennt jeder.
copy.
-
Arcoth schrieb:
Da braucht man nicht raten. Boost.Range kennt jeder.
copy.lol
Das begin/end stört mich weniger als die überflüssige Typinformation. Und da bietet Boost keine Lösung.
-
weisswastollist schrieb:
Das begin/end stört mich weniger als die überflüssige Typinformation. Und da bietet Boost keine Lösung.
Ja, weil das sonst keinen kümmert.
#include <iostream> class generic_ostream_iterator : public std::iterator<std::output_iterator_tag, void, std::ptrdiff_t, void, void> { std::ostream* const mPtr; char const* const delim; public: generic_ostream_iterator( std::ostream& os, char const* delim ) noexcept: mPtr{&os}, delim{delim} {} generic_ostream_iterator( std::ostream& os ) noexcept: generic_ostream_iterator{os, nullptr} {} generic_ostream_iterator& operator*() noexcept { return *this; } generic_ostream_iterator& operator++() noexcept { return *this; } generic_ostream_iterator& operator++(int) noexcept { return *this; } template<typename T> generic_ostream_iterator& operator=( T const& value ) { (*mPtr) << value; if(delim) (*mPtr) << delim; return *this; } }; int main() { int arr[]{ 1, 2, 3, 4, 5 }; std::copy( std::begin(arr), std::end(arr), generic_ostream_iterator{std::cout, ", "} ); }
-
Gibt es einen Grund wieso du beim Postinkrement keine Referenz auf ein konstantes Objekt zurückgibst und wieso du nicht einfach einen Default-Parameter im Konstruktor machst?
-
Ich wollte möglichst den Standard-
ostream_iteratorübernehmen.
-
wrock schrieb:
hi wie schreibe ich [...] mit der stl?
Da siehst du was passiert, wenn du hier solche Fragen stellst.
theliquidwave's Beitrag ist wohl am brauchbarsten. Oder der erste von Arcoth, wenn du die Schnittstelle nicht ändern willst.
-
Default-Parameter
Den Misnomer musst du dir noch abgewöhnen.
-
Arcoth schrieb:
Default-Parameter
Den Misnomer musst du dir noch abgewöhnen.
*[...]ein Default-Argument[...]
Besser?