У вас есть два класса Animal
и Dog
(где Dog
унаследовано от Animal
), и у Вас есть ситуация, где вы часто ожидающие животное, но отправляете экземпляр собаки. В моем конкретном случае я часто бросаю сильный указатель (std::shared_ptr<Dog>
) на ожидаемую звездой функцию (std::shared_ptr<Animal>
).C++ reinterpret_cast ссылки станда :: shared_ptr для оптимизации
Если мы согласны с тем, что мы можем сделать параметр функции ссылкой (std::shared_ptr<Animal>&
, избегая аргументов о том, почему у вас не должно быть сильных указателей в качестве ссылочных параметров из-за проблем с изменением прав собственности на потоки), я полагаю, что мы будем в безопасности -поля для литья std::shared_ptr<Dog> dog
с использованием reinterpret_cast<std::shared_ptr<Animal>&>(dog)
, правильно?
И если да, то что может возникнуть, кроме проблем с резьбой; как, например, эталонный счетный сорт?
Чтобы быть ясным, цель состоит в том, чтобы иметь решение, которое будет использоваться во многих случаях, когда литье однажды не является жизнеспособным решением. Это больше проблема, что есть много объектов, которые нужно было бы отличить. Кроме того, игнорирование того, что std::unique_ptr
может быть или не быть лучшим решением.
Чтобы добавить окончательное требование - использование простых указателей не позволило бы мне изменить оригинал std::shared_ptr
в случае универсальной функции класса сериализатора, которая является виртуальной и, следовательно, не может быть сделана шаблоном.
Почему бы вам не использовать ['static_pointer_cast'] (http://en.cppreference.com/w/cpp/memory/shared_ptr/pointer_cast)? – krzaq
Чтобы избежать накладных расходов. В моем конкретном случае это то, где генерируется код. Или в случае создания пользовательского конструктора копирования, где у вас есть несколько уровней наследования, и вам нужно продолжать кастинг вверх. –
Связаны ли эти классы по наследству? – Steve