Я думаю, это зависит от того, где вы будете их использовать. Я предполагаю, что вы думаете о том, чтобы сделать что-то вроде этого:
template <class T>
class BinaryTreeNode
{
//public interface ignored for this example
private:
shared_ptr<BinaryTreeNode<T> > left;
shared_ptr<BinaryTreeNode<T> > right;
T data;
}
Это имело бы смысл , если вы ожидаете, что ваша структура данных будет обрабатывать динамически созданные узлы. Однако, поскольку это не нормальный дизайн, я думаю, что это неуместно.
Мой ответ будет: нет, это не подходящее место для использования shared_ptr, так как использование shared_ptr подразумевает, что объект на самом деле является общим - однако, узел в двоичном дереве не когда-либо совместно использовался , Однако, как указал Мартин Йорк, зачем изобретать велосипед - уже есть умный тип указателя, который делает то, что мы пытаемся сделать - auto_ptr. Так что иди с чем-то вроде этого:
template <class T>
class BinaryTreeNode
{
//public interface ignored for this example
private:
auto_ptr<BinaryTreeNode<T> > left;
auto_ptr<BinaryTreeNode<T> > right;
T data;
}
Если кто-то спросит, почему данные не являются shared_ptr, ответ прост: если копии данных хороши для клиента библиотеки, они передают элемент данных и узел дерева делает копию. Если клиент решит, что копии являются плохой идеей, то код client может передать в shared_ptr, который может безопасно скопировать узел дерева.