На практике вы должны быть в состоянии это сделать (см. Другие ответы и комментарии), но вам необходимо знать о некоторых подводных камнях.
Если у вас есть класс, производный от другого класса (скажем, OtherClass
) и MyClass
, то вам нужно убедиться, что p
указывает на MyClass
часть, а не OtherClass
. Хотя у вас не будет неопределенного поведения, вы не найдете этот предмет.
class OtherClass { int someData; };
class WontWork : public OtherClass, public MyClass { };
auto *w = new WontWork();
c.insert(w);
void *p = w;
В этом случае вы не найдете p
в наборе, поскольку значение p
отличается от значения, вставленного в набор (после неявного приведения к MyClass *
).
Чтобы код работал, вам нужно p
указать на MyClass
часть, выполнив что-то вроде:
void *p = static_cast<MyClass *>(w);
или
MyClass *mc = w;
p = mc;
Но тогда вы должны убедиться, что вы не используете p
, как если бы он был типа OtherClass
или WontWork
где-нибудь в коде.
Если возможно, было бы предпочтительнее избегать void *
полностью путем исправления объявлений.