Это не прямой ответ на то, что вы хотели, а предложение о том, как сделать все лучше :) На самом деле вы все еще можете использовать семантику памяти std::unique_ptr
с сокрытием внутренних элементов и без использования уродливого void*
.Как уже упоминали другие, вы должны изучить PIMPL, но подытожим:
- Вперед объявите внутренний тип в общедоступном заголовке
- Используйте
std::unique_ptr
с этим типом и предоставьте dtorдля класса, который содержит этот член (в противном случае вы получите ошибки компиляции, потому что будет сгенерирован dtor по умолчанию, который попытается удалить объявленный заранее класс и не сможет это сделать).
Это будетВыглядите примерно так:
#include <memory>
class CPrivate; // Forward declare the internal class
class CPublic
{
public:
// You need the dtor here, since when you implement it in the .cpp of your library,
// where the definition of CPrivate is known, the dtor of std::unique_ptr will know how to delete it.
// If you do not put the dtor here, a default one will be generated here which invokes the dtor of std::unique_ptr, and here
// since CPrivate is forward declared the dtor of std::unique_ptr will not know how to delete it and you will get an error
~CPublic();
private:
std::unique_ptr<CPrivate> m_pPrivate;
}
Используя это, вы можете затем избежать приведения внутри реализации от void*
к фактическому типу.
Что касается исходного вопроса - вывсегда может привести void*
к std::unique_ptr<T>*
(указатель на unique_ptr
).Но я бы посоветовал оценить решение выше.Потому что вещь void*
устраняет всю строгость типов - например, что произойдет, если кто-то изменит T
?