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

Introspecting 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

Макро TTIBOOST_TTI_HAS_MEMBER_FUNCTIONПросматривает функцию члена класса.

BOOST_TTI_HAS_MEMBER_FUNCTION Он берет один параметр, который называется функцией внутреннего члена, существование которой программист хочет проверить. Макро генерирует метафункцию, называемую «has_member_function_»name_of_inner_member_function.

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

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

Факультативный тип тега Boost FunctionTypes может использоваться для указания cv-квалификации. Это означает, что вы можете добавить «const», «volatile» или оба, указав соответствующий тип тега. Альтернативой использованию типа тега является указание прилагаемого типа как «const», «volatile» или обоих. В качестве примера, если вы указываете тип тега как «boost::function_types::const_qualified» или если вы указываете прилагаемый тип как «const T», функция-член, которую вы интроспектируете, должна быть функцией const.

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

Return_Type ( Enclosing_Type::* ) ( Parameter_Types ) cv_qualifier(s)

где параметр _ Типы могут быть пустыми или разделенным запятой списком типов параметров, если существует более одного типа параметров. Cv-калификатор может быть «const», «летучим» или «const volatile».

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

Generating the metafunction

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

BOOST_TTI_HAS_MEMBER_FUNCTION(AMemberFunction)

генерирует метафункцию под названием «has_member_function_AMemberFunction» в текущем объеме.

Invoking the metafunction

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

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

has_member_function_AMemberFunction
  <
  Enclosing_Type,
  MemberFunction_ReturnType,
  boost::mpl::vector<MemberFunction_ParameterTypes>, // optional, can be any mpl forward sequence
  boost::function_types::SomeTagType                 // optional, can be any FunctionTypes tag type
  >::value
OR
has_member_function_AMemberFunction
  <
  MemberFunction_ReturnType (Enclosing_Type::*) (MemberFunction_ParameterTypes) optional_cv_qualification
  >::value

Examples

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

#include <boost/tti/has_member_function.hpp>
BOOST_TTI_HAS_MEMBER_FUNCTION(function1)
BOOST_TTI_HAS_MEMBER_FUNCTION(function2)
BOOST_TTI_HAS_MEMBER_FUNCTION(function3)

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

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

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

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

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

Metafunction re-use

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

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


PrevUpHomeNext

Статья Introspecting 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-20 05:11:16/0.0062921047210693/1