Обычно отвечают "сделай private конструктор и порождающую функцию". Но это pain и bore писать для каждого класса такую функцию. А написать обобщенную невозможно. Но всё гораздо проще. Не нужно обобщенной Create. Сделаем обобщённый Destroy. Всё равно нужно что-то писать, но уже гораздо меньше.
Ответ:
//maybe, boost::checked_delete ?
template <class T>
void kill(T *p)
{
(void)sizeof(T);
delete p;
}
class X
{
private:
virtual ~X() {}
friend void kill<X>(X *x);
};
int main()
{
{
X *p = new X;
kill(p); //OK.
}
{
X x;
//error: `virtual X::~X()' is private
}
}