irgendwo in meinem Code Angenommen, eine Funktion foo
mit einem Universal-Referenzparameter, , die ich nicht ändern kann:C++ Überladungsauflösung mit Funktionsvorlage Universal-Referenz, die nicht geändert werden kann
template<typename T>
auto foo(T&& t) { std::cout<<"general version"<<std::endl; }
Jetzt mag ich Überlastung foo
für eine gegebene Klasse A
, und stellen Sie sicher, dass für jeden Qualifier und Referenztyp von A
die Überlast aufgerufen wird. Dafür ich Brute-forcely kann eine Überlastung für alle möglichen Qualifikationen bieten (ignorieren volatile
jetzt):
auto foo(A & a) { std::cout<<"A&"<<std::endl; }
auto foo(A const& a) { std::cout<<"A const&"<<std::endl; }
auto foo(A && a) { std::cout<<"A &&"<<std::endl; }
auto foo(A const&& a) { std::cout<<"A const&&"<<std::endl; }
Demo. Dies skaliert jedoch sehr schlecht für weitere Parameter.
Alternativ kann ich nach Wert übergeben, die alle zu erfassen scheint auch die vorherigen Fälle:
auto foo(A a) { std::cout<<"A"<<std::endl; }
Demo. Jetzt müssen jedoch große Objekte kopiert werden (- zumindest im Prinzip).
Gibt es eine elegante Lösung für diese Probleme?
Denken Sie daran, dass ich die universelle Referenzfunktion nicht ändern kann, so dass SFINAE und dergleichen keine Möglichkeit ist.
Ist Schreiben eine Wrapper-Funktion, die Argumente für die korrekte Funktion leitet und die Verwendung dieser stattdessen eine vernünftige Lösung für Sie? – TartanLlama
AFAIK der Compiler sucht immer nach der spezifischsten Option. Was ist, wenn Sie ein enable_if> auf der "Überlast" hinzufügen? –
@TartanLlama: nicht wirklich. Im Code ist die entsprechende Funktion 'operator &&' (ich habe 'foo' als einfaches Beispiel genommen). Es ist eine Bibliothek und das ist zu fehlerhaft. – davidhigh