BOOST C бібліотека перетворень - хідер boost

Програма cast_test.cpp у вихідних засобах BOOST C++ використовується для перевірки правильної роботи цих шаблонів функцій.

Покажчики на поліморфні об'єкти (екземпляри класів, які містять принаймні одну віртуальну функцію) допускають два типи перетворень: downcast або crosscast. Перетворення d owncast означає перетворення від базового типу на похідний тип . Crosscast означає перетворення між рівнями ієрархії в діаграмі успадкування, таке як перетворення від одного базового класу на інший у разі множинного успадкування (у Y діаграмі).

Такі перетворення можуть бути виконані звичайними cast'ами, хоча такий підхід не рекомендується. Таким перетворенням не вистачає типобезпеки, читабельності коду, крім того їх важко знайти в коді за допомогою засобів пошуку.

Вбудований оператор перетворення мови C++ static_cast може бути використаний для ефективного виконання перетворення downcast вказівником на поліморфні об'єкти , але він не забезпечує виявлення помилок , коли вказівник насправді вказує на невірний похідний клас. Шаблон polymorphic_downcast зберігає ефективність перетворення static_cast для реліз-версій програм , а для версій налагодження додає перевірку успішності перетворення через використання макросу assert() до результату виклику dynamic_cast .

Вбудований оператор перетворення мови C++ dynamic_cast повинен використовуватися для перетворення посилань, а не вказівників. Крім того, це єдиний шаблон перетворення, який повинен використовуватися для перевірки, чи об'єктом підтримується заданий інтерфейс, у цьому випадку повернення 0 не є помилкою.

Описpolymorphic_cast та polymorphic_downcast

Приклад використання polymorphic_downcast

Шаблон перетворення static_cast або неявне перетворення не можуть забезпечити перевірку виникнення помилки переповнення (порушення діапазону) під час перетворення чисел . Шаблонна функція numeric_cast схожа на static_cast і деякі неявні перетворення такого типу, але вона перевіряє ситуацію порушення представимого діапазону. У разі порушення діапазону шаблон гунурує виняток.

Аргумент і значення, що повертається, повинні задовольняти наступним умовам:

  • аргумент і тип, що повертається, слідують парадигмі CopyConstructible [ISO Std 20.1.3].
  • аргумент і тип, що повертається слідують парадигмі Numeric, тобто вираз std::numeric_limits<>::is_specialized для них оцінюється в true .
  • Аргумент може бути перетворений на тип, що повертається через виклик static_cast .

Приклад використання numeric_cast

Обґрунтування для numeric_cast

Перевірка на діапазон виконується таким чином, що оператор != не використовується.

polymorphic_cast був запропонованийBjarne Stroustrupу "The C++ Programming Language".

polymorphic_downcast був реалізованийDave Abrahams.