Макро 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);
}
Макрос 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)
Макрос BOOST_TYPEOF_INTEGRAL
используется при регистрации интегрального параметра шаблона с использованием BOOST_TYPEOF_REGISTER_TEMPLATE
.
Полезно для enum
s и зависимых интегральных шаблонных параметров.
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))
)
Макро BOOST_TYPEOF_LIMIT_FUNCTION_ARITY
определяет, сколько параметров поддерживается для functios, и применяется к функциям, указателям функций, ссылкам на функции и указателям функций членов. Значение по умолчанию составляет 10. Переопределите, хотите ли вы, чтобы библиотека Typeof обрабатывала функции с большим количеством параметров.
Определять BOOST_TYPEOF_MESSAGE
перед включением boost/typeof/typeof.hpp для включения сообщений "using type of emulation" и "using native typeof". По умолчанию эти сообщения не будут отображаться.
Макро BOOST_TYPEOF_LIMIT_SIZE
определяет размер последовательности времени компиляции, используемой для кодирования типа. Значение по умолчанию составляет 50. Увеличьте его, если вы хотите, чтобы библиотека Typeof обрабатывала очень сложные типы, хотя эта возможность ограничена максимальным количеством параметров шаблона, поддерживаемых вашим компилятором. С другой стороны, если вы работаете только с очень простыми типами, уменьшение этого числа может помочь повысить производительность компиляции.
Макротип 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)
Макро 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))
Макрос 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)))
)
Макро 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;
}