Я думаю, что вы смотрите на неправильные требования.Вам не нужно выполнять кастинг, но вам может потребоваться реструктуризация кода.Если у вас есть связь классов A, которая создает mixin и B, который использует NonPoly, просто передайте B указатель NonPoly и используйте mixin непосредственно в A. Не должно быть никаких причин для того, чтобы отказаться от информации о типе в A, просто чтобы попытатьсяверни его снова.Если есть больше классов, разделите их на тех, кто знает миксин и тех, кто знает NonPoly, и это те же отношения.
И очень вероятно, что, если это в первую очередь, миксиндизайн не правильный подход.Очень часто миксины используются, когда необходимо простое сдерживание.В моем примере с A и B выше, у вас может быть класс Mixin
template <typename T>
class Mixin
{
T * GetObject()
{ return & t_; }
// other methods that use t_
private:
T t_;
};
, а затем просто передать объект, когда он нуждается в операции.Или, что еще более распространено, если вы просто передаете T какой-нибудь сторонней библиотеке, вам вообще не нужен миксин.Сдерживание может быть даже не лучшим.Лучший способ поддерживать инкапсуляцию - это всегда писать алгоритмы области файлов, когда вы можете манипулировать типом T через его открытый интерфейс и общедоступные подпрограммы сторонних производителей.
Если вы можете объяснить, почему вы считаете, что вам нужно потерять типинформацию, а затем восстановить, мы могли бы более четко показать, как вы можете реструктурировать владение так, чтобы это не происходило, но так как эта информация типа никогда не покидает среду выполнения (так как вы ищете для приведения - ваш вопрос подразумевает, что это не такполучить сериализацию или что-то еще), я могу заверить вас, что есть какой-то дизайн, в котором информация о типе не теряется в первую очередь.