Указатели - это просто указатели на данные.«Тип» указателя на самом деле не имеет никакого значения (во время компиляции), он только для удобства чтения и поддержки кода.
Например:
Foo<a> *x = new Foo<a>();
void *y = (void*)x;
Foo<a> *z = (Foo<a>*)y;
Совершенно верно и не вызовет никаких проблем.Единственная проблема при приведении типов указателей состоит в том, что вы можете столкнуться с проблемами разыменования, когда вы забыли, что на самом деле является базовым типом данных, на который ссылается указатель.
Если вы везде обойдете void *, простобудьте осторожны, чтобы сохранить целостность типов.
Не делайте что-то вроде:
Foo<a> *x = new Foo<a>();
void *z = (void*)x;
//pass around z for a while, then mistakenly...
Foo<b> *y = (Foo<b>*)z;
Случайно!