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.