Vorrei definire un puntatore condiviso il cui operator==
confronta il puntato con valori al posto dei puntatori, qualcosa del genere:
template <typename T>
struct deref_shared_ptr: std::shared_ptr<T> {
bool operator==(const deref_shared_ptr rhs) const {
return (**this == *rhs);
}
};
Questo tipo ha due potenziali problemi:
-
Deriva da un tipo di libreria standard.
-
Violare il principio di sostituzione di Liskov, poiché cambia la semantica di
operator==
.
Tuttavia, sto pensando che nessuno dei due è un problema a meno che non si usi il puntatore / riferimento di tipo base per riferirsi al tipo derivato. In particolare, questi problemi potrebbero non verificarsi mai nel codice del modello. Per i puntatori condivisi, la situazione è ancora migliore: i puntatori condivisi vengono memorizzati e passati per valore.
La mia logica è corretta? Ci sono ancora dei buoni motivi per evitare la definizione di cui sopra a favore della composizione?