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

Boost.Hana: Metafunction

Boost , ,

Boost.Hana  1.0.1
Your standard library for metaprogramming
А.Метафункция— это функция, которая выполняетхана::типs в качестве входов и возвратовхана: типкак результат.

А.Метафункцияявляется объектом, удовлетворяющим понятиюФункцияОбъект, но с дополнительными требованиями. Во-первых, должна быть возможность применитьМетафункциюк аргументам, меткой которых являетсяtype_tag, а результатом такого приложения должен быть объект, меткой которого также являетсяtype_tag. Обратите внимание, чтохана::типихана::basic_typeявляются единственными такими типами.

Во-вторых, метафункциядолжна обеспечивать вложенный шаблон::apply, который позволяет выполнять вычисления на уровне типа, как это делается оператором вызова. Следовательно, на языке Boost.MPLMetafunctionFявляетсяMetafunctionClassв дополнение к тому, что являетсяFunctionObject. Решительно, любой объектfтипаF, который являетсяметафункцией, и для произвольных типовT...:

f(hana::type_c<T>...) == hana::type_c<F::apply<T...>::type>

В-третьих, чтобы облегчить взаимодействие значений и типов,Метафункцияs должна также позволять вызывать аргументы, которые не являютсяханой::types. В этом случае результат эквивалентен вызову метафункции на типы аргументов. Строго говоря, это означает, что для произвольных объектовх...,

f(x...) == f(hana::type_c<decltype(x)>...)

Minimal complete definition

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

Concrete models

hana::metafunction,hana::metafunction_class,hana::template_

Rationale: Why aren't Metafunctions Comparable?

При видеханы::template_естественно возникает вопрос, следует лисделать метафункциюс сопоставимой. Действительно, представляется целесообразным сравнить два шаблонаFиGсtemplate_== template_. Однако в случае, когдаFи/илиGявляются шаблонами псевдонимов, имеет смысл говорить о двух типах сравнений. Первый из нихявляется поверхностнымсравнением, и он определяет, что два шаблона псевдонимов равны, если они являются одним и тем же шаблоном псевдонимов. Второе — этоглубокоесравнение, и оно определяет, что два псевдонима шаблона равны, если они псевдонимы одного типа для любого аргумента шаблона. Например, еслиFиGопределены как

template <typename T>
using F = void;
template <typename T>
using G = void;

Неглубокое сравнение определило бы, чтоFиGразные, потому что они являются двумя различными псевдонимами шаблона, в то время как глубокое сравнение определило бы, чтоFиGравны, потому что они всегда расширяются до одного типа,пустота. К сожалению, глубокое сравнение невозможно осуществить, потому что необходимо проверитьFиGна всех возможных типах. С другой стороны, поверхностное сравнение не является удовлетворительным, потому чтоМетафункцияs является ничем иным, как функциями натипеs, и равенство двух функций обычно определяется с глубоким сравнением. Поэтому мы придерживаемся консервативной позиции и избегаем сравненияМетафункции.

Variables

template<template< typename... > class F>
constexpr auto boost::hana::template_
 Lift a template to a Metafunction.Given a template class or template alias f, template_<f> is a Metafunction satisfying. More...
 
template<template< typename... > class F>
constexpr auto boost::hana::metafunction
 Lift a MPL-style metafunction to a Metafunction.Given a MPL-style metafunction, metafunction<f> is a Metafunction satisfying. More...
 
template<typename F >
constexpr auto boost::hana::metafunction_class
 Lift a MPL-style metafunction class to a Metafunction.Given a MPL-style metafunction class, metafunction_class<f> is a Metafunction satisfying. More...
 
constexpr auto boost::hana::integral
 Turn a Metafunction into a function taking types and returning a default-constructed object.Given a Metafunction f, integral returns a new Metafunction that default-constructs an object of the type returned by f. More specifically, the following holds: More...
 
template<template< typename... > class F>
constexpr auto boost::hana::trait = hana::integral(hana::metafunction<F>)
 Alias to integral(metafunction<F>), provided for convenience. More...
 

Variable Documentation

template<template< typename... > class F>
constexpr auto boost::hana::template_

#include<boost/hana/fwd/type.hpp>

Initial value:
= [](basic_type<T>-or-T ...) {
return hana::type_c<F<T...>>;
}

Поднимите шаблон к метафункции. При наличии класса шаблонов или псевдонимов шаблоновf,template_удовлетворяетMetafunction.

template_<f>(type_c<x>...) == type_c<f<x...>>
decltype(template_<f>)::apply<x...>::type == f<x...>
Note
template_ can't be SFINAE-friendly right now because of Core issue 1430.

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 ...> struct f;
struct x;
struct y;
BOOST_HANA_CONSTANT_CHECK(hana::template_<f>() == hana::type_c<f<>>);
BOOST_HANA_CONSTANT_CHECK(hana::template_<f>(hana::type_c<x>) == hana::type_c<f<x>>);
BOOST_HANA_CONSTANT_CHECK(hana::template_<f>(hana::type_c<x>, hana::type_c<y>) == hana::type_c<f<x, y>>);
static_assert(std::is_same<
decltype(hana::template_<f>)::apply<x, y>::type,
f<x, y>
>::value, "");
int main() { }
template<template< typename... > class F>
constexpr auto boost::hana::metafunction

#include<boost/hana/fwd/type.hpp>

Initial value:
= [](basic_type<T>-or-T ...) {
return hana::type_c<typename F<T...>::type>;
}

Поднимите метафункцию в стиле MPL к метафункции. Учитывая метафункцию в стиле MPL,метафункцияудовлетворяетМетафункция.

metafunction<f>(type_c<x>...) == type_c<f<x...>::type>
decltype(metafunction<f>)::apply<x...>::type == f<x...>::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;
template <typename ...> struct f { struct type; };
struct x;
struct y;
BOOST_HANA_CONSTANT_CHECK(hana::metafunction<f>() == hana::type_c<f<>::type>);
BOOST_HANA_CONSTANT_CHECK(hana::metafunction<f>(hana::type_c<x>) == hana::type_c<f<x>::type>);
BOOST_HANA_CONSTANT_CHECK(hana::metafunction<f>(hana::type_c<x>, hana::type_c<y>) == hana::type_c<f<x, y>::type>);
static_assert(std::is_same<
decltype(hana::metafunction<f>)::apply<x, y>::type,
f<x, y>::type
>::value, "");
int main() { }
template<typename F >
constexpr auto boost::hana::metafunction_class

#include<boost/hana/fwd/type.hpp>

Initial value:
= [](basic_type<T>-or-T ...) {
return hana::type_c<typename F::template apply<T...>::type>;
}
constexpr auto apply
Invokes a Callable with the given arguments.
Definition: apply.hpp:40

Поднимите класс метафункций в стиле MPL к метафункции. Учитывая класс метафункций в стиле MPL,metafunction_classудовлетворяетMetafunction.

metafunction_class<f>(type_c<x>...) == type_c<f::apply<x...>::type>
decltype(metafunction_class<f>)::apply<x...>::type == f::apply<x...>::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 f { template <typename ...> struct apply { struct type; }; };
struct x;
struct y;
BOOST_HANA_CONSTANT_CHECK(hana::metafunction_class<f>() == hana::type_c<f::apply<>::type>);
BOOST_HANA_CONSTANT_CHECK(hana::metafunction_class<f>(hana::type_c<x>) == hana::type_c<f::apply<x>::type>);
BOOST_HANA_CONSTANT_CHECK(hana::metafunction_class<f>(hana::type_c<x>, hana::type_c<y>) == hana::type_c<f::apply<x, y>::type>);
static_assert(std::is_same<
decltype(hana::metafunction_class<f>)::apply<x, y>::type,
f::apply<x, y>::type
>::value, "");
int main() { }
constexpr auto boost::hana::integral

#include<boost/hana/fwd/type.hpp>

Initial value:
= [](auto f) {
return [](basic_type<T>-or-T ...) {
return decltype(f)::apply<T...>::type{};
};
}
constexpr auto apply
Invokes a Callable with the given arguments.
Definition: apply.hpp:40

ПревратитеМетафункциюв функцию, принимающуютипи возвращающую объект, построенный по умолчанию. УчитываяМетафункциюf,интегралвозвращает новуюМетафункцию, которая по умолчанию конструирует объект типа, возвращаемогоf. В частности, следующие положения:

integral(f)(t...) == decltype(f(t...))::type{}

Основным вариантом использования дляинтегралаявляется преобразованиеметафункции, возвращающей тип, который наследует от значимого основания, такого какstd::integral_constant, в функции, возвращающиеся например,hana::integral_constant.

Note
  • Это неMetafunction, потому что это не возвращаетtype. Таким образом, не имеет смысла делатьdecltype(integral(f))класс метафункций MPL, как обычноMetafunctions.
  • При использованииintegralс возвращающимися метафункциямиstd::integral_constantс не забудьте включитьboost/hana/ext/std/integral_constant.hppзаголовок, чтобы Хана могла взаимодействовать с результатом.

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;
constexpr auto is_void = hana::integral(hana::metafunction<std::is_void>);
BOOST_HANA_CONSTANT_CHECK(is_void(hana::type_c<void>));
BOOST_HANA_CONSTANT_CHECK(hana::not_(is_void(hana::type_c<int>)));
int main() { }
template<template< typename... > class F>
constexpr auto boost::hana::trait = hana::integral(hana::metafunction<F>)

#include<boost/hana/fwd/type.hpp>

Отклонение отинтеграла (метафункция), предусмотренное для удобства.

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;
BOOST_HANA_CONSTANT_CHECK(hana::trait<std::is_integral>(hana::type_c<int>));
BOOST_HANA_CONSTANT_CHECK(hana::not_(hana::trait<std::is_integral>(hana::type_c<float>)));
int main() { }

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




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



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


реклама


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

Время компиляции файла: 2024-08-30 11:47:00
2025-05-19 17:57:44/0.0099380016326904/1