Начало. Библиотека TypeErasure обеспечивает полиморфизм времени выполнения на C++, который является более гибким, чем тот, который обеспечивается основным языком.
C++ имеет два различных вида полиморфизма, виртуальные функции и шаблоны, каждый из которых имеет свои преимущества и недостатки.
- Виртуальные функции не решаются до времени выполнения, в то время как шаблоны всегда решаются во время компиляции. Если ваши типы могут варьироваться во время выполнения (например, если они зависят от пользовательского ввода), то статический полиморфизм с шаблонами не очень помогает.
- Виртуальные функции могут использоваться с отдельной компиляцией. Корпус шаблона должен быть доступен в каждом блоке перевода, в котором он используется, замедляя компиляции и увеличивая перестройки.
- Виртуальные функции автоматически выдвигают требования к аргументам. Шаблоны проверяются только тогда, когда они инстанцируются, что требует дополнительной работы в тестировании, утверждениях и документации.
- Компилятор создает новую копию каждого шаблона функций каждый раз, когда он создается. Это позволяет лучше оптимизировать, потому что компилятор знает все статически, но это также вызывает значительное увеличение двоичных размеров.
- Шаблоны поддерживают ценностную семантику. Объекты, которые «ведут себя как int» и не являются общими, легче понять. Для использования виртуальных функций, с другой стороны, необходимо использовать (умные) указатели или ссылки.
- Библиотеки шаблонов могут позволять ненавязчиво адаптировать сторонние типы для бесшовной совместимости. С помощью виртуальных функций вам нужно создать обертку, которая наследуется от базового класса.
- Шаблоны могут обрабатывать ограничения, включающие несколько типов. Например, std::for_Every принимает диапазон итератора и функцию, которую можно вызвать на элементах диапазона. Виртуальные функции не могут выражать такие ограничения.
Начало. Библиотека TypeErasure сочетает в себе превосходные возможности абстракции шаблонов с гибкостью выполнения виртуальных функций.
Усиление включает в себя несколько особых случаев такого рода полиморфизма:
- <
boost::any
>Копиконструируемые типы.
- <
boost::function
>Для объектов, которые можно назвать функциями.
- Повышаю. Диапазон обеспечивает<
any_iterator
>.
Повышаю. TypeErasure обобщает это для поддержки произвольных требований и обеспечиваетпредопределенный набор общих понятий.