Я следую примеру в Ускоренный C ++ и пишу простой класс Handle
, который будет действовать как умный указатель. При этом используется идиома virtual ctor с использованием виртуальной функции clone()
. Все идет нормально. Но что делать, если я хочу использовать мой Handle
для классов, которые я не контролирую и которые не предоставляют clone()
?
Метод, предложенный в книге, заключается в создании глобальной clone
функции и использовании специализации шаблона (что-то, что я вижу впервые), чтобы при вызове clone()
с определенным аргумент, можно написать код для обработки этого случая.
Мой вопрос : это означает, что мне нужно написать clone()
версию для каждого типа класса, с которым, как я предполагаю, мой пользователь может использовать Handle
Это кажется довольно сложным! Есть ли более элегантный и / или простой способ решить эту проблему? Как это возможно, что такие вещи, как auto_ptr или boost :: shared_ptr могут обеспечить эту функциональность без утомительных clone()
определений?
Для полноты вот моя реализация класса Handle
:
template <class T> class Handle
{
public:
Handle() : p(0) {}
Handle(T* t) : p(t) {}
Handle( const Handle& s ) :p(0) { if (s.p) p = s.p->clone(); }
const Handle& operator=( const Handle& );
~Handle() { delete p; }
operator bool() { return p; }
T& operator*() { if (p) return *p; else throw std::runtime_error("Handle not bound"); }
T* operator->() { if (p) return p; else throw std::runtime_error("Handle not bound"); }
private:
T* p;
};
Спасибо!