Библиотека не определяет требуемых членов шаблонов классов в случае ошибки. Этот метод приводит к тому, что компилятор перестает отображать диагностику в клиентском коде, в точке, где ошибка фактически есть, вместо отслеживания инстанциаций шаблона в реализации библиотеки.
Компоненты библиотеки имеют ограниченные условия ошибки, поэтому проблематичный вход можно легко обнаружить.
MPL предоставляет алгоритмы по последовательностям, поэтому преобразования (такие как превращение типов параметров по величине в ссылки const для оптимизированной пересылки или вычисления подписи для специализации boost::function
после применения boost::bind
) могут быть выражены более легко. Концепция MPL Sequence совместима с несколькими другими библиотеками Boost (наиболее важно Fusion), поэтому еще одной причиной является совместимость.
Несмотря на их синтаксис, указатель на типы объектов-членов можно рассматривать как функции отсылки.
Это
-указатель, это
-ссылка или просто объект (или, может быть, даже умный указатель на объект) плюс корректировки cv-квалификации - все эти случаи имеют свое место, где-то и нет единого лучшего ответа.
Специальная обработка типа класса в последовательности может значительно усложнить клиентский код. Пользовательский аргумент ClassTransform
позволяет клиенту корректировать тип класса до формирования последовательности, а затем обрабатывать все параметры равномерно.
Давайте рассмотрим альтернативы.
Первый — просто использование большего количества шаблонов, поэтому каждое свойство должно быть запрошено явно. Этот подход приводит к более сложному клиентскому коду, если необходимо проверить более одного файла и экспоненциально увеличить интерфейс библиотеки.
Второй альтернативой является прохождение клиентом битовых шаблонов через нетиповые шаблонные параметры. Логика должна быть выполнена клиентом, и есть гораздо больше условий ошибки. Кроме того, шаблоны классов с нетиповыми параметрами шаблонов не работают в выражениях лямбда MPL и могут вызывать проблемы со старыми компиляторами.
Да, но это не сразу очевидно, так как набор возможных последовательностей MPL по своей сути не отделен от набора встроенных типов.
Однако любая попытка заставить встроенный тип работать в качестве последовательности MPL является плохой идеей, потому что встроенные типы доступны перед заголовками, которые делают тип последовательностью, которая может легко нарушить ODR.
Было сочтено предпочтительным, чтобы соблюдалось следующее условие:
mpl::size< parameter_types<T> >::value == function_arity<T>::value
Квалифицированный указатель cv по-прежнему является указателем. Обычно это не имеет значения, и даже если это так, это работа для Boost.TypeTraits.