Sto scrivendo una classe che utilizza due oggetti creati utilizzando un'interfaccia C. Gli oggetti assomigliano:unique_ptr, deleter personalizzato e regola zero Zero
typedef struct... foo_t;
foo_t* create_foo(int, double, whatever);
void delete_foo(foo_t*);
(in modo simile per bar_t
). Perché C++ 11, voglio avvolgerli in un puntatore intelligente in modo da non dover scrivere nessuno dei metodi speciali. La classe avrà la proprietà unica dei due oggetti, in modo da unique_ptr
logicamente ha senso ... ma sarebbe ancora dovuto scrivere un costruttore:
template <typename T>
using unique_ptr_deleter = std::unique_ptr<T, void(*)(T*)>;
struct MyClass {
unique_ptr_deleter<foo_t> foo_;
unique_ptr_deleter<bar_t> bar_;
MyClass()
: foo_{nullptr, delete_foo}
, bar_{nullptr, delete_bar}
{ }
~MyClass() = default;
void create(int x, double y, whatever z) {
foo_.reset(create_foo(x, y, z));
bar_.reset(create_bar(x, y, z));
};
Il rovescio della medaglia, con shared_ptr
, non avrei dovuto scrivere un costruttore, o usare un alias di tipo, dato che potrei semplicemente passare delete_foo
in reset()
- anche se ciò renderebbe il mio MyClass
copiabili e non lo voglio.
Qual è il modo corretto di scrivere MyClass
utilizzando la semantica unique_ptr
e continuare a rispettare la regola dello zero?
Questo sembra qualcosa che dovrebbe essere nella libreria standard. – rubenvb
Questo è stato fantastico. Ho finito per fare una leggera variazione di questo, con 'template struct unique_ptr_deleter;' che ha una classe privata 'deleter' e quindi' using type = std :: unique_ptr ; '. Salva la quantità di digitazione necessaria ... quindi posso inserirli entrambi insieme ('unique_ptr_deleter_t foo_;') –
Barry