Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

Boost.Hana: Core

Boost , ,

Boost.Hana  1.0.1
Your standard library for metaprogramming
Основные утилиты библиотеки.

Classes

struct  boost::hana::common< T, U, enabler >
 Metafunction returning the common data type between two data types. More...
 
struct  boost::hana::has_common< T, U, typename >
 Metafunction returning whether two data types share a common data type. More...
 
struct  boost::hana::default_
 Mark a tag-dispatched method implementation as a default implementation. More...
 
struct  boost::hana::is_default< Method, typename >
 Returns whether a tag-dispatched method implementation is a default implementation. More...
 
struct  boost::hana::tag_of< T, enabler >
 Metafunction returning the tag associated to T. More...
 
struct  boost::hana::is_convertible< From, To, typename >
 Returns whether there is a Hana-conversion from a data type to another. More...
 
struct  boost::hana::embedding< bool >
 Marks a conversion between data types as being an embedding. More...
 
struct  boost::hana::is_embedded< From, To, typename >
 Returns whether a data type can be embedded into another data type. More...
 
struct  boost::hana::when< condition >
 Enable a partial specialization only if a boolean condition is true. More...
 

Typedefs

template<typename T , typename U >
using boost::hana::common_t = typename common< T, U >::type
 Alias to common<T, U>::type, provided for convenience. More...
 
template<typename T >
using boost::hana::tag_of_t = typename hana::tag_of< T >::type
 Alias to tag_of<T>::type, provided for convenience. More...
 
template<typename... >
using boost::hana::when_valid = when< true >
 Variant of when allowing specializations to be enabled only if an expression is well-formed. More...
 

Variables

template<typename Tag , typename optional_T >
constexpr auto boost::hana::is_a = see-documentation
 Returns whether the tag of an object matches a given tag. More...
 
template<typename Tag , typename... T>
constexpr auto boost::hana::is_an = is_a<Tag, T...>
 Equivalent to is_a; provided for consistency with the rules of the English language.
 
template<typename Tag >
constexpr auto boost::hana::make
 Create an object of the given tag with the given arguments. More...
 
template<typename To >
constexpr auto boost::hana::to
 Converts an object from one data type to another. More...
 

Typedef Documentation

template<typename T , typename U >
using boost::hana::common_t = typedef typename common<T, U>::type

#include <boost/hana/fwd/core/common.hpp>

Alias to common::type, предусмотренный для удобства.

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)
#include <type_traits>
namespace hana = boost::hana;
static_assert(std::is_same<
hana::common_t<int, float>,
hana::common<int, float>::type
>{}, "");
int main() { }
template<typename T >
using boost::hana::tag_of_t = typedef typename hana::tag_of<T>::type

#include <boost/hana/fwd/core/tag_of.hpp>

Alias to tag_of::type, при условии удобства.

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)
#include <type_traits>
namespace hana = boost::hana;
struct PersonTag;
struct Person { using hana_tag = PersonTag; };
static_assert(std::is_same<hana::tag_of_t<Person>, PersonTag>{}, "");
int main() { }
template<typename... >
using boost::hana::when_valid = typedef when<true>

#include <boost/hana/fwd/core/ when.hpp>

Вариант , когда позволяет включить специализацию только в том случае, если выражение хорошо сформировано.

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)
#include <type_traits>
namespace hana = boost::hana;
template <typename T, typename = hana::when<true>>
struct base_template;
template <typename T>
struct base_template<T, hana::when_valid<typename T::value_type>> {
// something useful...
};
int main() { }
Bug:
Using when_valid seems to trigger ambiguous partial specializations on GCC.

Variable Documentation

template<typename Tag , typename optional_T >
constexpr auto boost::hana::is_a = see-documentation

#include <boost/hana/fwd/core/is_a.hpp>

Возвращает, соответствует ли тег объекта заданному тегу.

Учитывая тег Tag и тип C++ T, is_a представляет собой логическое время компиляции, представляющее, является ли тег T точно Tag. Другими словами, она эквивалентна

std::is_same<Tag, tag_of<T>::type>

Для удобства предусмотрен альтернативный синтаксис для использования is_a. В частности, is_a является функциональным объектом, возвращающим, имеет ли переданный аргумент заданный тег. Другими словами,

is_a<Tag>(x) == is_a<Tag, decltype(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)
namespace hana = boost::hana;
static_assert(hana::is_a<hana::tuple_tag, decltype(hana::make_tuple(1, '2', 3.3))>, "");
static_assert(!hana::is_a<hana::tuple_tag, void>, "");
static_assert(hana::is_an<hana::integral_constant_tag<int>>(hana::int_c<10>), "");
int main() { }
template<typename Tag >
constexpr auto boost::hana::make

#include <boost/hana/fwd/core/make.hpp>

Initial value:
= [](auto&& ...x) -> decltype(auto) {
return tag-dispatched;
}

Создайте объект данного тега с заданными аргументами.

Эта функция служит той же цели, что и конструкторы в обычном 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)
#include <string>
namespace hana = boost::hana;
int main() {
hana::tuple<int, char, double, std::string> ts{1, '2', 3.3, "abcd"};
BOOST_HANA_RUNTIME_CHECK(ts == hana::make_tuple(1, '2', 3.3, std::string{"abcd"}));
// std::string has no notion of tag, but it still works with make<>
std::string foo{"foo"};
BOOST_HANA_RUNTIME_CHECK(hana::make<std::string>("foo") == foo);
}
template<typename To >
constexpr auto boost::hana::to

#include <boost/hana/fwd/core/to.hpp>

Initial value:
= [](auto&& x) -> decltype(auto) {
return tag-dispatched;
}

Преобразует объект из одного типа данных в другой.

to является естественным расширением структуры языка static_cast для типов данных. Учитывая тип данных назначения To и объект x, to создает новый объект типа данных To из x. Обратите внимание, однако, что to не требуется для фактического создания нового объекта и может возвращать ссылку на исходный объект (например, при попытке преобразовать объект в свой собственный тип данных).

В качестве естественного расширения static_cast, to обеспечивает поведение по умолчанию. Для целей нижеследующего, пусть To будет типом данных назначения и From будет типом данных x, то есть типом исходных данных. Затем to имеет следующее поведение по умолчанию:

  1. ЕслиToиFromтипы данных одинаковы, то объект пересылается как есть.
  2. В противном случае, еслиFromконвертируется вToс использованиемstatic_cast,xпреобразуется вFromс использованиемstatic_cast.
  3. В противном случае вызов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)
namespace hana = boost::hana;
template <typename X, typename Y, typename Z>
struct Triple {
X first;
Y second;
Z third;
};
BOOST_HANA_CONSTEXPR_LAMBDA auto triple = [](auto x, auto y, auto z) {
return Triple<decltype(x), decltype(y), decltype(z)>{x, y, z};
};
namespace boost { namespace hana {
template <typename X, typename Y, typename Z>
struct to_impl<tuple_tag, Triple<X, Y, Z>> {
static constexpr auto apply(Triple<X, Y, Z> xs) {
return make_tuple(xs.first, xs.second, xs.third);
}
};
}}
int main() {
hana::to<hana::tuple_tag>(triple(1, '2', 3.3)) == hana::make_tuple(1, '2', 3.3)
);
}

Статья Boost.Hana: Core раздела может быть полезна для разработчиков на c++ и boost.




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-30 11:47:00
2025-05-19 21:33:37/0.011054992675781/1