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

Reference

Boost , The Boost C++ Libraries BoostBook Documentation Subset , Chapter 39. Boost.Typeof

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

Reference

AUTO, AUTO_TPL

Макро BOOST_AUTO эмулирует предложенное ключевое слово auto на C++.

Usage
BOOST_AUTO(var,expr)
BOOST_AUTO_TPL(var,expr)

Arguments

var

переменная, инициализируемая выражением

expr

действительное выражение c++

Remarks

Если вы хотите использовать auto в шаблон-контексте, используйте BOOST_AUTO_TPL(expr), который заботится о ключевом слове typename внутри выражения auto.

Sample Code
int main()
{
    length::meter a(5);
    force::newton b(6);
    BOOST_AUTO(c, a * b);
}

COMPLIANT

Макрос BOOST_TYPEOF_COMPLIANT может использоваться для форсирования режима эмуляции. Определите его, если ваш компилятор по умолчанию использует другой режим, такой как нативный typeof или Microsoft-специфический трюк, но вы хотите использовать режим эмуляции, например, по причинам переносимости.

INCREMENT_REGISTRATION_GROUP

Макро BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP гарантирует, что регистрации типов в различных файлах заголовка получают уникальные идентификаторы.

Usage
#include BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP()
Remarks

один раз в каждом файле cpp/hpp, где выполняется любая регистрация, перед любой регистрацией.

Sample Code
#include BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP()
class X;
BOOST_TYPEOF_REGISTER_TYPE(X)

INTEGRAL

Макрос BOOST_TYPEOF_INTEGRAL используется при регистрации интегрального параметра шаблона с использованием BOOST_TYPEOF_REGISTER_TEMPLATE.

Полезно для enums и зависимых интегральных шаблонных параметров.

Usage
BOOST_TYPEOF_INTEGRAL(x)

Arguments

x

полностью квалифицированный интегральный тип или число

Remarks

Был реализован короткий синтаксис для встроенных типов (int, bool, long, unsigned long и т.д.) Другие нетиповые параметры шаблона (например, указатель на член) не поддерживаются.

Sample Code
#include BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP()
namespace foo
{
    enum color {red, green, blue};
    template<color C0,typename T1>
    class class_with_enum {};
    template<typename T0,T0 I1>
    class class_with_dependent_non_type {};
}
BOOST_TYPEOF_REGISTER_TEMPLATE(foo::class_with_enum,
    (BOOST_TYPEOF_INTEGRAL(foo::color))
    (typename)
    )
BOOST_TYPEOF_REGISTER_TEMPLATE(foo::class_with_dependent_non_type,
    (typename)
    (BOOST_TYPEOF_INTEGRAL(P0))
    )

LIMIT_FUNCTION_ARITY

Макро BOOST_TYPEOF_LIMIT_FUNCTION_ARITY определяет, сколько параметров поддерживается для functios, и применяется к функциям, указателям функций, ссылкам на функции и указателям функций членов. Значение по умолчанию составляет 10. Переопределите, хотите ли вы, чтобы библиотека Typeof обрабатывала функции с большим количеством параметров.

MESSAGES

Определять BOOST_TYPEOF_MESSAGE перед включением boost/typeof/typeof.hpp для включения сообщений "using type of emulation" и "using native typeof". По умолчанию эти сообщения не будут отображаться.

LIMIT_SIZE

Макро BOOST_TYPEOF_LIMIT_SIZE определяет размер последовательности времени компиляции, используемой для кодирования типа. Значение по умолчанию составляет 50. Увеличьте его, если вы хотите, чтобы библиотека Typeof обрабатывала очень сложные типы, хотя эта возможность ограничена максимальным количеством параметров шаблона, поддерживаемых вашим компилятором. С другой стороны, если вы работаете только с очень простыми типами, уменьшение этого числа может помочь повысить производительность компиляции.

REGISTER_TYPE

Макротип BOOST_TYPEOF_REGISTER_TYPE информирует библиотеку Typeof о существовании типа

Usage
BOOST_TYPEOF_REGISTER_TYPE(x)

Arguments

x

полностью квалифицированный тип

Remarks

Необходимо использовать в глобальном пространстве имен

Sample Code
#include BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP()
namespace foo
{
    class bar {};
    enum color {red, green, blue};
}
BOOST_TYPEOF_REGISTER_TYPE(foo::bar)
BOOST_TYPEOF_REGISTER_TYPE(foo::color)

REGISTER_TEMPLATE

Макро BOOST_TYPEOF_REGISTER_TEMPLATE информирует библиотеку Typeof о существовании шаблона и описывает его параметры

Usage
BOOST_TYPEOF_REGISTER_TEMPLATE(x, n)
BOOST_TYPEOF_REGISTER_TEMPLATE(x, seq)

Arguments

x

полностью квалифицированный шаблон

n

количество шаблонных аргументов. Действительны только в том случае, если все аргументы шаблона являются именами типов

seq

последовательность шаблонных аргументов. Необходимо использовать при наличии интегральных или шаблонных параметров

Remarks

Они должны использоваться в глобальном пространстве имен.

Библиотека позволяет регистрировать шаблоны с параметрами типа, интеграла и шаблона:

  • Параметр шаблона типа описывается элементом последовательности (class) или (typename)
  • Параметр шаблона известного интегрального типа можно описать, просто поставив его тип, как ( неподписанный int). Поддерживаются следующие известные интегральные типы:
    • [подписанный/неподписанный] чар
    • [ неподписанный] короткий
    • [ неподписанный] int
    • [ неподписанный] длинный
    • неподписанный
    • bool
    • size_t
  • Суммы и типдефы интегральных типов должны быть описаны явно с макросом BOOST_TYPEOF_INTEGRAL, как (BOOST_TYPEOF_INTEGRAL(MyEnum))
  • Параметры шаблона шаблона описаны с макросом BOOST_TYPEOF_TEMPLATE, например: (BOOST_TYPEOF_TEMPLATE(класс)(неподписанныйint))). В случае всех типовых параметров это может быть сокращено до (BOOST_TYPEOF_TEMPLATE(2)). Параметры вложенных шаблонов не поддерживаются.
Sample Code
#include BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP()
namespace foo
{
    template<typename T0, typename T1>
    class simple_template {};
    template<typename T0, int I1>
    class class_with_integral_constant {};
}
BOOST_TYPEOF_REGISTER_TEMPLATE(foo::simple_template, 2)
BOOST_TYPEOF_REGISTER_TEMPLATE(foo::class_with_integral_constant, (typename)(int))

TEMPLATE

Макрос BOOST_TYPEOF_TEMPLATE используется при регистрации параметров шаблона с использованием BOOST_TYPEOF_REGISTER_TEMPLATE.

Usage
BOOST_TYPEOF_TEMPLATE(n)
BOOST_TYPEOF_TEMPLATE(seq)

Arguments

n

количество шаблонных аргументов. Действительны только в том случае, если все аргументы шаблона являются именами типов

seq

последовательность шаблонных аргументов. Необходимо использовать при наличии интегральных констант в вложенном шаблоне

Remarks

Не может использоваться для регистрации вложенных параметров шаблона.

Sample Code
#include BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP()
namespace foo
{
    enum color {red, green, blue};
    template<color C0, template<typename> class T1>
    class nested_template_class {};
    template<template<typename, unsigned char> class T1>
    class nested_with_integral {};
}
BOOST_TYPEOF_REGISTER_TEMPLATE(foo::nested_template_class,
    (foo::color)
    (BOOST_TYPEOF_TEMPLATE(1))
    )
BOOST_TYPEOF_REGISTER_TEMPLATE(foo::nested_with_integral,
    (BOOST_TYPEOF_TEMPLATE((typename)(unsigned char)))
    )

TYPEOF, TYPEOF_TPL

Макро BOOST_TYPEOF вычисляет тип выражения, но удаляет квалификаторы верхнего уровня, const&

Usage
BOOST_TYPEOF(expr)
BOOST_TYPEOF_TPL(expr)

Arguments

expr

допустимое выражение c++, которое может быть связано с T&

Remarks

Если вы хотите использовать typeof в шаблон-контексте, используйте BOOST_TYPEOF_TPL(expr), который заботится о typename внутри выражения typeof.

Sample Code
template<typename A, typename B>
struct result_of_conditional
{
    typedef BOOST_TYPEOF_TPL(true?A():B()) type;
};
template<typename A, typename B>
result_of_conditional<A, B>::type min(const A& a,const B& b)
{
    return a < b ? a : b;
}

TYPEOF_NESTED_TYPEDEF, TYPEOF_NESTED_TYPEDEF_TPL

Макро TYPEOF_NESTED_TYPEDEF работает во многом так же, как макрос TYPEOF, но обрабатывает несколько недостатков компилятора.

Usage
BOOST_TYPEOF_NESTED_TYPEDEF(name,expr)
BOOST_TYPEOF_NESTED_TYPEDEF_TPL(name,expr)

Arguments

name

действительный идентификатор для вложения типа операции внутри

экспр

допустимое выражение c++, которое может быть связано с T&

Remarks

«typeof_nested_typedef» вмещает операцию «typeof» внутри структуры. Таким образом, операция «типа» может быть разделена на два этапа, деконфузируя несколько компиляторов (особенно VC7.1 и VC8.0). Это также устраняет ограничение, налагаемое BOOST_TYPEOF_LIMIT_SIZE и позволяет использовать «тип» на гораздо более крупных выражениях.

Если вы хотите использовать typeof_nested_typedef в шаблон-контексте, используйте BOOST_TYPEOF_NESTED_TYPEDEF_TPL(name,expr), который заботится о typename внутри выражения typeof.

«typeof_nested_typedef» не может быть использован в области функций/блоков.

Sample Code
template<typename A, typename B>
struct result_of_conditional
{
    BOOST_TYPEOF_NESTED_TYPEDEF_TPL(nested,true?A():B())
    typedef typename nested::type type;
};
template<typename A, typename B>
result_of_conditional<A, B>::type min(const A& a,const B& b)
{
    return a < b ? a : b;
}

PrevUpHomeNext

Статья Reference раздела The Boost C++ Libraries BoostBook Documentation Subset Chapter 39. Boost.Typeof может быть полезна для разработчиков на c++ и boost.




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



:: Главная :: Chapter 39. Boost.Typeof ::


реклама


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

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