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

Introspecting static member function

Boost , Chapter 1. The Type Traits Introspection Library , Chapter 1. The Type Traits Introspection Library

Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

PrevUpHomeNext

Макро TTI BOOST_TTI_HAS_STATIC_MEMBER_FUNCTION интроспектирует статическую функцию члена класса.

BOOST_TTI_HAS_STATIC_MEMBER_FUNCTION принимает один параметр, который является названием внутренней статической функции члена, существование которого программист хочет проверить. Макро генерирует метафункцию 'has_static_member_ function_name_of_inner_static_member_ function'.

На метафункцию можно ссылаться двумя разными способами.

Первый способ состоит в том, чтобы передать его тип блокировки для интроспектирования и подпись для функции статического члена как отдельные аргументы шаблона. Сигнатура для функции статического члена состоит из типа возврата, факультативных типов параметров в виде импульса::mpl передняя последовательность типов, а также опционального типа тега Boost FunctionTypes. Типичный импульс::mpl передняя последовательность типов - это повышение::mpl::vector<>.

Второй способ состоит в том, чтобы передать его тип блокировки для интроспектирования и подпись для функции статического члена как функции. Функция имеет форму:

Return_Type ( Parameter_Types )

где Параметр_ Типы могут быть пустыми или смешанным списком типов параметров, если существует более одного типа параметров.

Метафункция возвращает один тип, называемый «типом», который является импульсом::mpl::bool_. В качестве удобства метафункция возвращает значение этого типа непосредственно в виде константы bool времени компиляции, называемой "значение". Это верно или неверно в зависимости от того, существует или нет внутренняя статическая функция члена указанной подписи.

Generating the metafunction

Вы генерируете метафункцию, ссылаясь на макрос с именем функции внутреннего статического элемента:

BOOST_TTI_HAS_STATIC_MEMBER_FUNCTION(AStaticMemberFunction)

генерирует метафункцию, называемую 'has_static_member_ function_AStaticMemberFunction' в текущей области.

Invoking the metafunction

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

Значение возврата, называемое «значением», является константой компиляции времени дурака.

has_static_member_function_AStaticMemberFunction
  <
  Enclosing_Type,
  StaticMemberFunction_ReturnType,
  boost::mpl::vector<StaticMemberFunction_ParameterTypes>, // optional, can be any mpl forward sequence
  boost::function_types::SomeTagType                       // optional, can be any FunctionTypes tag type
  >::value
OR
has_static_member_function_AStaticMemberFunction
  <
  Enclosing_Type,
  Return_Type ( Parameter_Types )
  >::value

Examples

Сначала мы создаем метафункции для различных внутренних статических названий функций-членов:

#include <boost/tti/has_static_member_function.hpp>
BOOST_TTI_HAS_STATIC_MEMBER_FUNCTION(function1)
BOOST_TTI_HAS_STATIC_MEMBER_FUNCTION(function2)
BOOST_TTI_HAS_STATIC_MEMBER_FUNCTION(function3)

Далее давайте создадим определенные пользователем типы, которые мы хотим интроспектировать.

struct AClass { };
struct Top
  {
  static int function1();
  static AClass function2(double,short *);
  };
struct Top2
  {
  static long function2(Top &,int,bool,short,float);
  static Top * function3(long,int,AClass &);
  };

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

Мы покажем обе формы в следующих примерах. Обе формы полностью взаимозаменяемы по желаемому результату.

has_static_member_function_function1<Top,int>::value; // true
has_static_member_function_function1<Top,int ()>::value; // true
has_static_member_function_function1<Top2,int>::value; // false
has_static_member_function_function2<Top,AClass,boost::mpl::vector<double,short *> >::value; // true
has_static_member_function_function2<Top2,AClass,boost::mpl::vector<double,short *> >::value; // false
has_static_member_function_function2<Top2,long (Top &,int,bool,short,float)>::value; // true
has_static_member_function_function3<Top2,int ()>::value; // false
has_static_member_function_function3<Top2,Top * (long,int,AClass &)>::value; // true;

Metafunction re-use

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

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


PrevUpHomeNext

Статья Introspecting static member function раздела Chapter 1. The Type Traits Introspection Library Chapter 1. The Type Traits Introspection Library может быть полезна для разработчиков на c++ и boost.




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



:: Главная :: Chapter 1. The Type Traits Introspection Library ::


реклама


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

Время компиляции файла: 2024-08-30 11:47:00
2025-05-19 20:18:18/0.0067100524902344/0