SFINAE mit Oder-Verknüpfung



  • Hallo,
    ich würde gerne eine Template-Funktion schreiben, die sowohl für QMapals auch std::map funktioniert.
    Das Problem ist, dass der Key-Value-Iterator von QMap und std::map unterschiedlich aufgerufen werden und die Funktion readItems() nicht mit derselben Bedingung aktiviert werden kann.
    Die unterschiedlichen Iteratoren sind im Funktionsblock hingegen kein Problem, da sie dort nicht verwendet werden. Stattdessen wird etwas in die Map gespeichert, was sowohl bei QMap als auch std::map mit dem []-Operator gleich aufgerufen wird.

    Das ist der Ist-Zustand

    auto readItems(Map& map) -> decltype(
    		map.keyValueBegin() == map.keyValueEnd(), // Aktiviere diese Funktion für QMap
    		void()) // use void as return type for this method
    {
    	// Write something into map
    }
    

    Nun hätte ich gerne so etwas:

    auto readItems(Map& map) -> decltype(
    		map.keyValueBegin() == map.keyValueEnd() || map.begin()->first, // Aktiviere diese Funktion für QMap und std::map
    		void()) // use void as return type for this method
    {
    	// Write something into map
    }
    

    Ich hab mir schon std::disjunction angeschaut, bin damit aber nicht weiter gekommen.
    Ich bin auf C++ 17 beschränkt.

    Weiß jemand weiter?
    Danke im Voraus!


  • Mod

    Ohne Concepts wird das eben nicht so prägnant wie in Deinem Beispiel. Du wirst zwei detectors schreiben müssen, die jeweils QMap und std::map erkennen, um in der Signatur von readItems darauf zurueckgreifen.



  • Hi Columbo,
    Ok und wie gehe ich dann danach vor, wenn ich zwei Detektoren habe? Benutze ich dann std::disjunction?


Anmelden zum Antworten