Iteratoren auf alle möglichen Container



  • Hallo liebe Containerfreunde!
    Ich habe irgendwie öfter das Problem, dass ich eine Funktion habe, die etwas mit einer "Sammlung" eines Datentyps machen soll. Allerdings macht die Funktion nur für einen Datentyp Sinn.
    Wie macht ihr so etwas? Optimal wäre es ohne Templates (Compilezeit..), aber auch wenn man es mit Templates macht:

    template<typename It>
    void foo(It begin, It end)
    

    Wie macht man dem Compiler möglichst hübsch klar, dass *It == Typ gelten muss? Meine einzige Idee wäre ein static_assert(std::is_same<decltype(*begin), Type>::value, "Only Type");
    Habt ihr da schönere Ideen?



  • Das macht in den seltensten Fällen Sinn, darum prüft man es i.d.R. einfach gar nicht, bzw. lässt es einfach den Compiler prüfen.
    Du kannst ja mal ein reales Beispiel zeigen.. Das wurde ansonsten aber auch schon sehr oft hier gefragt.



    1. Wie du gezeigt hast mit static_assert und z.B. decltype
    template<typename It, typename std::enable_if<std::is_same<typename std::iterator_traits<It>::value_type, MyType>::value, bool>::type = true>
    void foo(It begin, It end)
    
    1. Nichts tun und dem Compiler einfach Fehlermeldungen werfen lassen, wenn der value_type die durchgeführten Operationen nicht unterstützt.

    Die Unterschiede:

    1. wirft einfach einen Compilerfehler, wenn die Funktion gerufen wird.
    2. lässt die Funktion garnicht erst am Überladungsset teilnehmen, d.h. du könntest sie anderweitig überladen, sie wird auf keinen Fall gerufen, wenn der Typ nicht passt.
    3. Du kriegst einen (zugegebenermaßen etwas obskuren) Compilerfehler, wenn der tatsächliche value_typ nicht die verwendeten Operationen anbietet. Das heißt, auch andere Typen funktionieren, wenn sie das passende Interface anbieten.

Anmelden zum Antworten