template argument bei operatoren explizit angeben
-
hallo, wie kann man template argumente bei operatoren explizit angeben?
betroffene zeile:
std::for_each(Result.begin(), Result.end(), std::cout.operator<<); // funktioniert nicht weil mehrdeutigkeitstd::for_each(Result.begin(), Result.end(), std::cout.operator<< <char>); // funktioniert nicht weil syntaktisch inkorrektgruss
-
Das klappt eh nicht wie du es dir gedacht hast, denn sämtliche STL Algorithmen basieren darauf,d ass sie mit func() aufgerufen werden können. (Eventuell halt mit ein oder zwei Parametern).
<< für cout müsste aber so aufgerufen werden:
cout.operator<<(param); // oder operator<<(cout, param);In beiden Fällen wäre der Templateparameter deduzierbar durch den auszugebenden Parameter.
Die zweite Version fällt auch schon dadurch flach, dass for_each etwa so aufgebaut ist:
// ... for( ; first != last; ++first) Func(*first); // ...Es wird also in keinem Fall ein zweiter Parameter mit übergeben.
Es gibt natürlich noch std::function und std::bind, aber für so einen simplen Fall wie cout auf alle Elemente anzuwenden reicht eine kleine Funktion oder ein kleiner Funktor.
template<class T> void print(T const& x) { cout << x; } // ... for_each(std::begin(Result), std::end(Result), print);
-
okay das ist verständlich. dass operator<< sowohl als methode als auch als freie funktion definiert werden kann ist mir in dem zusammenhang nicht in den sinn gekommen, leuchtet natürlich ein.
sehe ich das richtig dass man das problem auch mit einer lambda funktion lösen kann?
und rein interessenshalber: kann man dennoch ein spezifiziertes operator template als funktionszeiger übergeben? wenn ja, wie sieht die syntax aus?
-
Du hast noch zwei weitere Möglichkeiten:
copy(Result.begin(), Result.end(), ostream_iterator<char>(cout, ","));oder über Lambdas
for_each(Result.begin(), Result.end(), [](char res) { cout << res << ","; });
-
flabbahz schrieb:
sehe ich das richtig dass man das problem auch mit einer lambda funktion lösen kann?
Klar, Lambdas sind ja im Prinzip nix anderes als normale Funktionen, nur halt ohne expliziten Namen. Hat halt so nen Funktionen Code Style.
(Wobei ich immer noch nicht verstehe, was an Funktionaler Programmierung so toll sein soll, und was da eigentlich die Krux ist Oo?!)
-
Klar, Lambdas sind ja im Prinzip nix anderes als normale Funktionen
Lambda-Ausdrücke sind sog. closure-Objekte, die den function-call-operator überladen.
@KasF:
Wobei hier einostreambuf_iteratorviel besser passt, das ist viel effizienter.
-
Sone schrieb:
Wobei hier ein
ostreambuf_iteratorviel besser passt, das ist viel effizienter.Das stimmt. Ich wollte aber gerne ein Trennzeichen mitgeben
