Das Folgende ist ein Versuch, einen gemeinsamen Zeiger mit einer modifizierten Semantik von operator==
Umsetzung:Wie wird in privat abgeleitete Kindtypen umgewandelt?
template <typename T>
struct deref_shared_ptr: private std::shared_ptr<T> {
using Base = std::shared_ptr<T>;
// ... using statements to include functionality from the base.
bool operator==(const deref_shared_ptr rhs) const {
return (**this == *rhs);
}
};
ich mit der Umsetzung eines Äquivalents std::make_shared
für diese Art bin zu kämpfen. Dies ist mein Versuch:
template< class T, class... Args >
deref_shared_ptr<T> make_deref_shared(Args&&... args) {
return reinterpret_cast<deref_shared_ptr<T>>(std::make_shared<T>(args...));
}
Das funktioniert nicht: die Compiler (g++ 5.4.0
) beschwert mich über eine ungültige Stimme. Warum funktioniert es nicht und was sollte ich anstelle dieser Besetzung tun?
Verwenden 'friend'. Es ist keine Sünde. –
@ n.m. Meinst du einen privaten Konstruktor zu haben, der ein 'std :: shared_ptr'-Argument annimmt? – AlwaysLearning
Sorry, habe deinen Code nicht zu genau angeschaut. Das Umwandeln in einen abgeleiteten Typ (kein Zeiger) ist nur möglich, wenn der abgeleitete Typ einen Konstruktor hat, der den übergeordneten Typ annimmt, oder der übergeordnete Typ einen Konvertierungsoperator vom richtigen Typ hat. Also ja, du brauchst einen Konstruktor. Ob Sie es privat machen oder nicht, liegt an Ihnen, –