Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

Header boost/polymorphic_cast.hpp Documentation

Boost , ,

Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

Header boost/polymorphic_cast.hpp

Cast Functions

Заголовокboost/polymorphic_cast.hppпредоставляет<polymorphic_cast>и<polymorphic_downcast>шаблоны функций, предназначенные для дополнения встроенных отливок C++.

Заголовокboost/polymorphic_pointer_cast.hppсодержит<polymorphic_pointer_cast>и<polymorphic_pointer_downcast>шаблоны функций.

Программаcast_test.cppможет использоваться для проверки работы этих шаблонов функций, как и ожидалось.

Polymorphic casts

Указатели на полиморфные объекты (объекты классов, которые определяют по меньшей мере одну виртуальную функцию) иногда являются нисходящими или перекрестными. Downcasting означает литье из базового класса в производный класс. Кросскастинг означает литье по диаграмме иерархии наследования, например, от одного основания к другому в иерархии диаграмм<Y>.

Такие отливки можно делать с отливками в старом стиле, но такой подход никогда не рекомендуется. Старый стиль литья катастрофически не хватает в безопасности типа, страдают плохой читаемости, и трудно найти с помощью инструментов поиска.

Встроенный в C++<static_cast>может использоваться для эффективного ниспровержения указателей на полиморфные объекты, но не обеспечивает обнаружения ошибок в случае, когда отлитый указатель фактически указывает на неправильный производный класс. Шаблон<polymorphic_downcast>сохраняет эффективность<static_cast>для компиляций без отладки, но для компиляций отладки добавляет безопасность через утверждение (), что<dynamic_cast>преуспевает.

Встроенный в C++<dynamic_cast>может использоваться для нисходящих и перекрестных переадресаций указателей на полиморфные объекты, но уведомление об ошибке в виде возвращенного значения 0 неудобно для тестирования, или, что еще хуже, легко забыть о тестировании. Бросающая форма<dynamic_cast>, которая работает на ссылках, может использоваться на указателях через уродливое выражение &<dynamic_cast<T&>(*p)>, что вызывает неопределенное поведение, если<p>является<0>.<polymorphic_cast>Шаблон выполняет<dynamic_cast>на указателе и бросает исключение, если<dynamic_cast>возвращается 0.

А<polymorphic_downcast>должны быть использованы для понижения, что вы уверены, что должны преуспеть. Проверка ошибок выполняется только в единицах перевода, где<NDEBUG>не определено, через<

 assert( dynamic_cast<Derived>(x) == x )
>, где<x>является указателем источника. Такой подход гарантирует не только возврат ненулевого указателя, но и его правильность при наличии множественного наследования. Попытки кросскаста с использованием<polymorphic_downcast>не удастся собрать.Предупреждение:Поскольку<polymorphic_downcast>использует утверждение(), оно нарушает Правило Одного Определения (ODR), если NDEBUG непоследовательно определен в единицах перевода. [См. ISO Std 3.2]

Для кросскастов, или когда успех литья может быть известен только во время выполнения, или когда эффективность не важна,<polymorphic_cast>является предпочтительным.

Встроенный в C++<dynamic_cast>должен использоваться для литья ссылок, а не указателей. Это также единственный бросок, который можно использовать для проверки того, поддерживается ли данный интерфейс; в этом случае возврат 0 не является условием ошибки.

Хотя<polymorphic_downcast>и<polymorphic_cast>работают только со встроенными типами указателей,<polymorphic_pointer_downcast>и<polymorphic_pointer_cast>являются более общими версиями с поддержкой любого типа указателей, для которого будут действительны следующие выражения:

Для<polymorphic_pointer_downcast>:

  static_pointer_cast<Derived>(p);
  dynamic_pointer_cast<Derived>(p);


Для<polymorphic_pointer_cast>:

  dynamic_pointer_cast<Derived>(p);
  !p; // conversion to bool with negation


Это включает в себя C++ встроенные указатели,<std::shared_ptr, boost::shared_ptr, boost::intrusive_ptr>и т.д.

polymorphic_cast, polymorphic_downcast, polymorphic_pointer_cast and polymorphic_pointer_downcast synopsis

namespace boost {
template <class Derived, class Base>
inline Derived polymorphic_cast(Base* x);
// Throws: std::bad_cast if ( dynamic_cast<Derived>(x) == 0 )
// Returns: dynamic_cast<Derived>(x)
template <class Derived, class Base>
inline Derived polymorphic_downcast(Base* x);
// Effects: assert( dynamic_cast<Derived>(x) == x );
// Returns: static_cast<Derived>(x)
template <class Derived, class Base>
inline auto polymorphic_pointer_cast(Base x);
// Throws: std::bad_cast if ( dynamic_pointer_cast<Derived>(x) == 0 )
// Returns: dynamic_pointer_cast<Derived>(x)
template <class Derived, class Base>
inline auto polymorphic_pointer_downcast(Base x);
// Effects: assert( dynamic_pointer_cast<Derived>(x) == x );
// Returns: static_pointer_cast<Derived>(x)
}

polymorphic_downcast example

#include <boost/polymorphic_cast.hpp>
...
class Fruit { public: virtual ~Fruit(){}; ... };
class Banana : public Fruit { ... };
...
void f( Fruit * fruit ) {
// ... logic which leads us to believe it is a Banana
  Banana * banana = boost::polymorphic_downcast<Banana*>(fruit);
  ...

polymorphic_pointer_downcast example

#include <boost/polymorphic_pointer_cast.hpp>
class Fruit { public: virtual ~Fruit(){} };
class Banana : public Fruit {};
// use one of these:
typedef Fruit* FruitPtr;
typedef std::shared_ptr<Fruit> FruitPtr;
typedef boost::shared_ptr<Fruit> FruitPtr;
typedef boost::intrusive_ptr<Fruit> FruitPtr;
void f(FruitPtr fruit)
{
  // ... logic which leads us to believe it is a banana
  auto banana = boost::polymorphic_pointer_downcast<Banana>(fruit);
  ...
}

History

<polymorphic_cast>был предложен Бьярном Страуструпом в «Языке программирования C++».
<polymorphic_downcast>внес вкладДэйв Абрахамс.
<polymorphic_pointer_downcast>внес вкладБорис Расини<polymorphic_pointer_cast>Антоний Полухин.
Старый<numeric_cast>, который был внесёнКевлином Хенни, теперь засеянБиблиотекой увеличения численного преобразования.


Пересмотрено23 июня 2005June 23, 2005[ORIG_END] -->

Статья Header boost/polymorphic_cast.hpp Documentation раздела может быть полезна для разработчиков на c++ и boost.




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-30 11:47:00
2025-05-19 20:05:52/0.028674125671387/1