L' altro giorno mi è capitato codice simile a questo:
Il fatto è che penso che tutto ciò possa essere ottimizzato usando i template, in particolare eliminando tutta la gerarchia delle classi e far diventare foo e bar una funzione e una classe template e poi utilizzando direttamente i metodi che espone la classe base. Ho fatto notare ciò al fornitore della libreria, il quale mi ha risposto piuttosto male dicendo che le ottimizzazioni portate dai template sono trascurabili rispetto ai costi delle vtable e che anzi introducono solo complessità nel codice.codice:struct StreamBase { virtual bool open() = 0; virtual int write(const std::string& data) = 0; virtual void close() = 0; virtual void flush() = 0; } struct FileStream : StreamBase { // implementazioni } // altre implementazioni void foo(std::unique_ptr<StreamBase> stream) { // stuff } struct bar { explicit bar(std::unique_ptr<StreamBase> stream) : _stream(std::move(stream)) {} private: std::unique_ptr<StreamBase> _stream; };
A questo punto sorgre la questione: quando usare i template e quando l' ereditarietà?
Secondo me è preferibile usare i template quando la funzione o classe necessita solo di una "conformità" di interfaccia, mentre usare l' ereditarietà solo nei casi in cui è necessaria il polimorfismo a runtime.
Vorrei sapere se ciò che penso è corretto e se qualcun può darmi qualche altra dritta.