SFINAE mit Oder-Verknüpfung
-
Hallo,
ich würde gerne eine Template-Funktion schreiben, die sowohl fürQMap
als auchstd::map
funktioniert.
Das Problem ist, dass der Key-Value-Iterator vonQMap
undstd::map
unterschiedlich aufgerufen werden und die FunktionreadItems()
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 beiQMap
als auchstd::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!
-
Ohne Concepts wird das eben nicht so prägnant wie in Deinem Beispiel. Du wirst zwei detectors schreiben müssen, die jeweils
QMap
undstd::map
erkennen, um in der Signatur vonreadItems
daraufzurueckgreifen
.
-
Hi Columbo,
Ok und wie gehe ich dann danach vor, wenn ich zwei Detektoren habe? Benutze ich dannstd::disjunction
?