Проблема в классе вашего указателя-члена.
В таких языках, как C #, это возможно, поскольку существует "object" класс, из которого происходит любой другой класс.В этом случае вы потеряете безопасность типов.
Однако в C ++ такой вещи нет, поэтому у вас есть 2 варианта:
- Использование void * и reinterpet_cast - очень некрасиво, действительно небезопасно из-за безопасности типов.
- Написание тонн перегрузок для вашего класса - для каждого класса.Невозможно, потому что это не будет работать с новыми классами.
Таким образом, лучший способ - использовать шаблоны.
Кстати, идея template настолько хороша, что C # начал использовать его после некоторой версии.