2016-08-08 1 views
4

Wir alle wissen, dass C-Style-Casts in C++ als böse angesehen werden. Aus diesem Grund werden sie durch const_cast<>, static_cast<> und dynamic_cast<> ersetzt, um ein gezielteres Casting zu ermöglichen, so dass der Programmierer nur die beabsichtigten Konvertierungsklassen zulässt. So weit, ist es gut.Nur zum Umwerfen

Jedoch scheint es keine eingebaute Syntax zu sein eine explizite upcast auszuführen: A bedeutet die ansonsten implizite Umwandlung in Base& baseRef = derived explizit ohne dass die umgekehrten auszuführen.

Während ich weiß, dass dies eine ziemlich kleine Ecke Fall ist (die meiste Zeit die impliziten Konvertierungen funktionieren gut), habe ich mich gefragt, welche Techniken verfügbar sind, um eine solche Umwandlung in Benutzercode zu implementieren. Ich war jedoch nach dem Vorbild der

template<class T> 
class upcast { 
    public: 
     template<class U, typename = typename std::enable_if<std::is_convertible<U, T>::value>::type> 
     upcast(U value) : value(value) {} 
     operator T() { return value; } 
    private: 
     T value; 
}; 

über etwas nachzudenken, die zu kompliziert scheint gut zu sein, und da ich kein Experte in Template-Metaprogrammierung bin, würde Ich mag fragen, ob es andere/bessere/einfachere Ansätze.

+2

Ich bin nicht sicher, was Sie versuchen hier zu erreichen. Sie können static_cast zum Upcasting verwenden. –

+0

Sie können 'reference' nicht mit' dynamic_cast' oder einer anderen Umwandlung umstellen, da 'reference' nicht' null' sein kann. Es gibt also keine Möglichkeit zu sagen, ob upcast gültig ist oder nicht. – LibertyPaul

+2

@LibertyPaul Ich bin mir nicht sicher, was du meinst. Upcasting mit 'dynamic_cast' ist immer erfolgreich und ein schlechter downcast wird' std :: bad_cast' werfen, wenn Referenzen verwendet werden. – TartanLlama

Antwort

2

std::forward<T&> nur upcasts erlauben:

struct A {}; 
struct B : A {}; 
A a; 
B b; 
auto& x = std::forward<A&>(b); // OK 
auto& y = std::forward<B&>(a); // fails 
auto* px = std::forward<A*>(&b); // OK 
auto* py = std::forward<B*>(&a); // fails 
Verwandte Themen