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

Tutorial

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

Tutorial

Чтобы начать использовать тип, включите тип заголовка:

#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));
}

Пожалуйста, смотрите ссылку для более подробной информации.


PrevUpHomeNext

Статья Tutorial раздела 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:27:21/0.0069429874420166/0