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 mehrdeutigkeit
    
    std::for_each(Result.begin(), Result.end(), std::cout.operator<< <char>); // funktioniert nicht weil syntaktisch inkorrekt
    

    gruss



  • 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 ein ostreambuf_iterator viel besser passt, das ist viel effizienter.



  • Sone schrieb:

    Wobei hier ein ostreambuf_iterator viel besser passt, das ist viel effizienter.

    Das stimmt. Ich wollte aber gerne ein Trennzeichen mitgeben 🙂


Anmelden zum Antworten