Я следую примеру в Ускоренный C++ и написав простой класс Handle
, который будет действовать как интеллектуальный указатель. Это использует virtual ctor idiom с использованием виртуальной функции clone()
. Все идет нормально. Но что делать, когда я хочу использовать мой Handle
для классов, которые я не контролирую, которые не предоставляют clone()
?Как написать дескрипторы для классов, у которых нет члена 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;
};
Спасибо!
Использование clone() не очень похоже на C++. –