Чтобы начать использовать тип, включите тип заголовка:
#include <boost/typeof/typeof.hpp>
Для вывода типа выражения во время компиляции используют макрос<BOOST_TYPEOF
>:
namespace ex1
{
typedef BOOST_TYPEOF(1 + 0.5) type;
BOOST_STATIC_ASSERT((is_same<type, double>::value));
}
В зависимом контексте используйте<BOOST_TYPEOF_TPL
>вместо<BOOST_TYPEOF
>:
namespace ex2
{
template<class T, class U>
BOOST_TYPEOF_TPL(T() + U()) add(const T& t, const U& u)
{
return t + u;
};
typedef BOOST_TYPEOF(add('a', 1.5)) type;
BOOST_STATIC_ASSERT((is_same<type, double>::value));
}
Приведенные выше примеры возможны потому, что Библиотека Типоф знает о примитивных типах, таких как<int
>,<double
>,<char
>и т.д. Библиотека Typeof также знает о большинстве типов и шаблонов, определенных Стандартной библиотекой C++, но для этого необходимо включить соответствующие заголовки:
#include <boost/typeof/std/utility.hpp>
namespace ex3
{
BOOST_AUTO(p, make_pair(1, 2));
BOOST_STATIC_ASSERT((is_same<BOOST_TYPEOF(p), pair<int, int> >::value));
}
Здесь<<boost/typeof/std/utility.hpp>
>включает<<utility>
>и содержит знания о шаблонах, определенных там. Это соглашение об именовании применяется в целом, например, для того, чтобы позволить библиотеке Typeof обрабатывать<std::vector
>, включать<<boost/typeof/std/vector.hpp>
>и т. Д.
Чтобы вывести тип переменной из выражения, эта переменная инициализируется, используйте макрос<BOOST_AUTO
>(или<BOOST_AUTO_TPL
>в зависимом контексте:
#include <boost/typeof/std/string.hpp>
namespace ex4
{
BOOST_AUTO(p, new int[20]);
BOOST_STATIC_ASSERT((is_same<BOOST_TYPEOF(p), int*>::value));
}
И<BOOST_TYPEOF
>, и<BOOST_AUTO
>размещают классификаторы верхнего уровня. Следовательно, чтобы выделить, например, ссылку, она должна быть четко указана:
namespace ex5
{
string& hello()
{
static string s = "hello";
return s;
}
BOOST_AUTO(&s, hello());
}
Чтобы лучше понять этот синтаксис, обратите внимание, что он расширяется на:
BOOST_TYPEOF(hello()) &s = hello();
Если вы определите свой собственный тип, библиотека Typeof не сможет справиться с ним, если вы не сообщите ему об этом типе. Вы сообщаете библиотеке Typeof о типе (или шаблоне) посредством «регистрации» этого типа / шаблона.
Любой исходный или заголовочный файл, в котором зарегистрированы типы/шаблоны, должен содержать следующую строку перед любой регистрацией:
#include BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP()
После этого тип может быть зарегистрирован:
namespace ex6
{
struct MyType
{};
}
BOOST_TYPEOF_REGISTER_TYPE(ex6::MyType)
Регистрация должна осуществляться в контексте глобального пространства имен; необходимо использовать полностью квалифицированное имя типа.
Любое количество типов может быть зарегистрировано в одном файле, каждый на отдельной строке.
После регистрации вашего типа библиотека Typeof может обрабатывать его в любом контексте:
namespace ex6
{
typedef BOOST_TYPEOF(make_pair(1, MyType())) type;
BOOST_STATIC_ASSERT((is_same<type, pair<int, MyType> >::value));
}
Шаблон регистрируется путем указания его полностью квалифицированного названия и описания его параметров. В простейшем случае, когда все параметры являются параметрами типа, необходимо указать только их количество:
namespace ex7
{
template<class T, class U>
struct MyTemplate
{};
}
BOOST_TYPEOF_REGISTER_TEMPLATE(ex7::MyTemplate, 2)
namespace ex7
{
typedef BOOST_TYPEOF(make_pair(1, MyTemplate<int, ex6::MyType>())) type;
BOOST_STATIC_ASSERT((is_same<type,
pair<int, MyTemplate<int, ex6::MyType> >
>::value));
}
Когда шаблон имеет интегральные параметры шаблона, все параметры должны быть описаны в последовательности препроцессора:
namespace ex8
{
template<class T, int n>
struct MyTemplate
{};
}
BOOST_TYPEOF_REGISTER_TEMPLATE(ex8::MyTemplate, (class)(int))
namespace ex8
{
typedef BOOST_TYPEOF(make_pair(1, MyTemplate<ex7::MyTemplate<ex6::MyType, int>, 0>())) type;
BOOST_STATIC_ASSERT((is_same<type,
pair<int, MyTemplate<ex7::MyTemplate<ex6::MyType, int>, 0> >
>::value));
}
Пожалуйста, смотрите ссылку для более подробной информации.