Вариант , когда позволяет включить специализацию только в том случае, если выражение хорошо сформировано.
when_valid<...> всегда эквивалентно when. Однако при использовании в рамках частичной специализации SFINAE будет вызывать игнорирование частичной специализации, когда выражение плохо сформировано.
Example
// Copyright Louis Dionne 2013-2016
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
Возвращает, соответствует ли тег объекта заданному тегу.
Учитывая тег Tag и тип C++ T, is_a представляет собой логическое время компиляции, представляющее, является ли тег T точно Tag. Другими словами, она эквивалентна
std::is_same<Tag, tag_of<T>::type>
Для удобства предусмотрен альтернативный синтаксис для использования is_a. В частности, is_a является функциональным объектом, возвращающим, имеет ли переданный аргумент заданный тег. Другими словами,
Создайте объект данного тега с заданными аргументами.
Эта функция служит той же цели, что и конструкторы в обычном C++. Однако вместо того, чтобы создавать объект определенного типа C++, он создает объект определенного тега, независимо от типа C++ этого объекта.
Эта функция на самом деле является переменным шаблоном, поэтому make может передаваться как объект функции, создавая объект тега T. Кроме того, он использует диспетчеризацию тегов, поэтому он должен быть настроен для пользовательских тегов.
Наконец, реализация по умолчанию make эквивалентна вызову конструктора данного тега с соответствующими аргументами. Другими словами, по умолчанию,
make<T>(args...) == T(args...)
Обратите внимание, что аргументы идеально переадресованы, а форма конструкции, которая используется, точно такая же, как и документированная, т.е. T(args...). Однако если T(args...) не является действительным выражением, срабатывает ошибка компиляции. Это поведение по умолчанию полезно, потому что оно делает иностранные типы C++, которые не имеют понятия тега, конструируемого с make из коробки, поскольку их тег точно сам по себе.
Example
// Copyright Louis Dionne 2013-2016
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
Преобразует объект из одного типа данных в другой.
to является естественным расширением структуры языка static_cast для типов данных. Учитывая тип данных назначения To и объект x, to создает новый объект типа данных To из x. Обратите внимание, однако, что to не требуется для фактического создания нового объекта и может возвращать ссылку на исходный объект (например, при попытке преобразовать объект в свой собственный тип данных).
В качестве естественного расширения static_cast, to обеспечивает поведение по умолчанию. Для целей нижеследующего, пусть To будет типом данных назначения и From будет типом данных x, то есть типом исходных данных. Затем to имеет следующее поведение по умолчанию:
ЕслиToиFromтипы данных одинаковы, то объект пересылается как есть.
В противном случае, еслиFromконвертируется вToс использованиемstatic_cast,xпреобразуется вFromс использованиемstatic_cast.
В противном случае вызовto<From>(x)вызывает статическое утверждение.
Тем не менее, to является функцией, распределенной по тегу, что означает, что to_impl может быть специализирован в пространстве имен boost::hana для настройки своего поведения для произвольных типов данных. Также обратите внимание, что to распространяется по тегу с использованием обоих типов данных To и From, что означает, что to_impl называется to_impl::apply(x). Также обратите внимание, что некоторые концепции обеспечивают конверсию в или из своих моделей. Например, любой Foldable может быть преобразован в Sequence. Это достигается специализацией to_impl всякий раз, когда To представляет собой Sequence и From представляет собой Foldable. Когда такие преобразования предоставляются, они документируются в исходной концепции, в данном случае Foldable.
Hana-convertibility
Когда объект x типа данных From может быть преобразован в тип данных To с использованием to, мы говорим, что x является Хана-конвертируемым к типу данных To. Мы также говорим, что существует Хана-конверсия от От до К . Эта часть терминологии полезна, чтобы избежать путаницы различных видов конверсий, предлагаемых C++.
Embeddings
Как вы уже могли видеть, Хана использует алгебраические и категорно-теоретические структуры по всему миру, чтобы помочь точно определить понятия. Эти структуры всегда имеют операции, связанные с ними, поэтому они полезны. Понятие встраивания захватывает идею введения меньшей структуры в большую, сохраняя при этом операции структуры. Другими словами, встраивание является инъекционным отображением, которое также сохраняет структуру. Что именно означает сохранение операций структуры, остается объяснить документацией каждой структуры. Например, когда мы говорим о встраивании Моноида из Моноида A в Моноид B, мы просто имеем в виду инъекционное преобразование, которое сохраняет идентичность и ассоциативную операцию, как описано в Monoid.
Но как это связано с функцией to? Проще говоря, функция to представляет собой отображение между двумя типами данных, которые иногда будут своего рода структурой, и иногда полезно знать, правильно ли такое отображение, то есть без потерь и сохранение структуры. Критерий для того, чтобы это преобразование было хорошо проведено, заключается именно в том, чтобы быть встраиванием. Чтобы указать, что преобразование является встраиванием, просто используйте embedding Тип как базовый класс соответствующей специализации to_impl. Очевидно, вы должны убедиться, что преобразование действительно является встраиванием, если вы не хотите выстрелить себе в ногу.
Template Parameters
To
Тип данных, к которому необходимо преобразовать x.
Parameters
x
Объект для преобразования в заданный тип данных.
Example
// Copyright Louis Dionne 2013-2016
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
Статья Boost.Hana: Core раздела может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.