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

An example using the Macro Metafunctions

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

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

// An enclosing type
struct AType
  {
  // Type
  typedef int AnIntType; // as a typedef
  struct BType // as a nested type
    {
    struct CType
      {
      };
    };
  // Template
  template <class> struct AMemberTemplate { };
  template <class,class,class> struct AnotherMemberTemplate { };
  template <class,class,int,class,template <class> class,class,long> struct ManyParameters { };
  template <class,class,int,short,class,template <class,int> class,class> struct MoreParameters { };
  // Data
  BType IntBT;
  // Function
  int IntFunction(short) { return 0; }
  // Static Data
  static short DSMember;
  // Static Function
  static int SIntFunction(long,double) { return 2; }
  };

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

#include <boost/tti/tti.hpp>
template<class T>
struct OurTemplateClass
  {
  // compile-time template code regarding T
  };

Теперь давайте создадим и созовем макро-метафуны для каждого из наших типов внутренних элементов, чтобы увидеть, соответствует ли тип T выше нашему гипотетическому типу выше. Представьте, что это находится в пределах 'Наш шаблон класса' выше. В приведенных ниже примерах один и тот же макрос используется только один раз, чтобы избежать нарушений УСО.

Type

Имеет У T есть вложенный тип, называемый "AnIntType"?

BOOST_TTI_HAS_TYPE(AnIntType)
has_type_AnIntType
  <
  T
  >

Имеет У T есть вложенный тип, называемый 'BType'?

BOOST_TTI_HAS_TYPE(BType)
has_type_BType
  <
  T
  >

Type checking the typedef using a lambda expression

Имеет У T есть вложенный тип, называемый «AnIntType», тип которого является «int»?

#include <boost/mpl/placeholders.hpp
#include <boost/type_traits/is_same.hpp
using namespace boost::mpl::placeholders;
has_type_AnIntType
  <
  T,
  boost::is_same<_1,int>
  >

Template

Имеет T имеет вложенный шаблон класса под названием "AMemberTemplate", параметры которого являются всеми типами ('class' или 'typename'?

BOOST_TTI_HAS_TEMPLATE(AMemberTemplate,BOOST_PP_NIL)
has_template_AMemberTemplate
  <
  T
  >

Template using variadic macros

Имеет T имеет вложенный шаблон класса под названием "AMemberTemplate", параметры которого являются всеми типами ('class' или 'typename'?

BOOST_TTI_HAS_TEMPLATE(AnotherMemberTemplate)
has_template_AnotherMemberTemplate
  <
  T
  >

Template with params

Имеет T имеет вложенный шаблон класса под названием «MoreParameters», параметры которого точно указаны?

BOOST_TTI_HAS_TEMPLATE(MoreParameters,(8,(class,class,int,short,class,template <class,int> class,class)))
has_template_MoreParameters
  <
  T
  >

Template with params using variadic macros

Имеет T имеет вложенный шаблон класса под названием «ManyParameters», параметры которого точно указаны?

BOOST_TTI_HAS_TEMPLATE(ManyParameters,class,class,int,class,template <class> class,class,long)
has_template_ManyParameters
  <
  T
  >

Member data

Имеет У T есть данные-члены, называемые 'IntBT', тип которых 'AType::BType'?

BOOST_TTI_HAS_MEMBER_DATA(IntBT)
has_member_data_IntBT
  <
  T,
  AType::BType
  >

Member data with composite type

Имеет У T есть данные-члены, называемые 'IntBT', тип которых 'AType::BType'?

BOOST_TTI_HAS_MEMBER_DATA(IntBT)
has_member_data_IntBT
  <
  AType::BType T::*
  >

Member function with individual types

Имеет T имеет функцию члена, называемую 'IntFunction', чей тип 'int (короткометражный)?

BOOST_TTI_HAS_MEMBER_FUNCTION(IntFunction)
has_member_function_IntFunction
  <
  T,
  int,
  boost::mpl::vector<short>
  >

Member function with composite type

Имеет T имеет функцию члена, называемую 'IntFunction', чей тип 'int (короткометражный)?

BOOST_TTI_HAS_MEMBER_FUNCTION(IntFunction)
has_member_function_IntFunction
  <
  int (T::*)(short)
  >

Static member data

Имеет У T есть статические данные участника, называемые 'DSMember', чей тип «короткий»?

BOOST_TTI_HAS_STATIC_MEMBER_DATA(DSMember)
has_static_member_data_DSMember
  <
  T,
  short
  >

Static member function with individual types

Имеет T имеет статическую функцию члена, называемую 'SIntFunction', чей тип 'int (длинный, двойной)?

BOOST_TTI_HAS_STATIC_MEMBER_FUNCTION(SIntFunction)
has_static_member_function_SIntFunction
  <
  T,
  int,
  boost::mpl::vector<long,double>
  >

Static member function with composite type

Имеет T имеет статическую функцию члена, называемую 'SIntFunction', чей тип 'int (длинный, двойной)?

BOOST_TTI_HAS_STATIC_MEMBER_FUNCTION(SIntFunction)
has_static_member_function_SIntFunction
  <
  T,
  int (long,double)
  >

Data

Имеет У T есть данные-член или статические данные-члены, называемые DSMember, чей тип «короткий»?

BOOST_TTI_HAS_DATA(DSMember)
has_static_member_data_DSMember
  <
  T,
  short
  >

Function

Имеет T имеет функцию члена или статическую функцию члена, называемую "IntFunction", чей тип "int (короткометражный)"?

BOOST_TTI_HAS_FUNCTION(IntFunction)
has_function_IntFunction
  <
  T,
  int,
  boost::mpl::vector<short>
  >

Member type

Создание вложенного типа T::BType::CType без создания ошибки компилятора, если T не имеет вложенного типа BType::CType?

BOOST_TTI_MEMBER_TYPE(BType)
BOOST_TTI_MEMBER_TYPE(CType)
typename
member_type_CType
  <
  typename
  member_type_BType
    <
    T
    >::type
  >::type

Member type existence

Является ли вложенный тип T::BType::CType, созданный без создания ошибки компилятора, если T не имеет вложенного типа BType:: CType, на самом деле существует?

BOOST_TTI_MEMBER_TYPE(BType)
BOOST_TTI_MEMBER_TYPE(CType)
typedef typename
member_type_CType
  <
  typename
  member_type_BType
    <
    T
    >::type
  >::type
AType;
boost::tti::valid_member_type
  <
  AType
  >

PrevUpHomeNext

Статья An example using the Macro Metafunctions раздела 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 09:53:08/0.0068480968475342/0