Проблема заключается в классе вашего указателя.
В таких языках, как C#, возможно, потому что существует «объект» класс, из которого вытекает каждый другой класс. В этом случае вы потеряете безопасность типа.
Однако, в C++ вы не имеете такую вещь, которая оставляет вас с 2-х вариантов:
- Использование пустоту * и reinterpet_cast - очень некрасиво, на самом деле не безопасно из-за безопасности типа ,
- Написание тонн перегрузок для вашего класса - для каждого класса. Это невозможно, потому что он не будет работать с новыми классами.
Таким образом, лучший способ - использовать шаблоны.
Кстати, идея шаблона настолько хороша, что C# начал использовать его после некоторой версии.
Можете ли вы дать какой-то пример того, что вы хотите? Вам нужен какой-то «беспричинный» «shared_ptr», с которым вы не сможете получить доступ к содержащимся данным, но которые вы могли бы удерживать в течение длительного времени, чтобы отложить уничтожение? –
Почему вы хотите избежать шаблонов? Описывая свои цели (умный указатель, который работает в ситуации X), а не конкретная попытка решения (избегать шаблонов), может обеспечить лучшее решение. – jalf
Вы можете написать базовый класс без шаблона, который использует 'void * 'для управляемого указателя, затем класс шаблона, который происходит из этого базового класса и добавляет безопасность типа. Пользователи видят только шаблон класса. Это то, о чем вы говорите? Я подозреваю, что это довольно бессмысленно, хотя в том, что любой код, который вы поместили бы в базовый класс, мог бы также быть в вспомогательном классе, который не является базовым классом, поэтому это довольно незначительная деталь реализации. –