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

Reference

Boost , The Boost C++ Libraries BoostBook Documentation Subset , Chapter 42. Boost.Variant

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

Concepts

BoundedType

Требования к привязанному типу следующие:

  • CopyConstructible или MoveConstructible.
  • Destructor поддерживает гарантию безопасности без бросков.
  • Полный в точке вариант мгновенный шаблон. (См. boost::recursive_wrapper для обертывания типа, который принимает неполные типы для рекурсивных variant типов.)

Каждый тип, указанный в качестве аргумента шаблона для variant, должен, как минимум, выполнять вышеперечисленные требования. Кроме того, некоторые функции вариант доступны только в том случае, если его ограниченные типы соответствуют требованиям этих следующих дополнительных понятий:

  • Назначим: вариант сам по себе Установимый если и только если каждый из его ограниченных типов отвечает требованиям концепции. (Примечание, что топ-уровень const-квалифицированные типы и эталонные типы соответствуют этим требованиям.)
  • MoveAssignable: variant сам по себе MoveAssignable если и только если каждый из его ограниченных типов отвечает требованиям концепции. (Примечание, что топ-уровень const-квалифицированные типы и эталонные типы соответствуют этим требованиям.)
  • DefaultConstructible [20.1.4]: variant сам по себе DefaultConstructible, если и только если его первый ограниченный тип (т.е. T1) отвечает требованиям концепции.
  • Равенство Сравнение: вариант само по себе Равенство Сравнительно, если и только если каждый из его ограниченных типов отвечает требованиям концепции.
  • LessThanComparable: variant сам по себе LessThanComparable, если и только если каждый из его ограниченных типов отвечает требованиям концепции.
  • Установимость: вариант само по себе OutputStreamable если и только если каждый из его ограниченных типов отвечает требованиям концепции.
  • Hashable: variant сам по себе Hashable если и только если каждый из его ограниченных типов отвечает требованиям концепции.

StaticVisitor

Требования к статическому посетителю типа T следующие:

  • Должна допускать вызов в качестве функции путем перегрузки operator(), однозначно принимая любое значение типа T.
  • Должен разоблачить внутренний тип result_type. C++14 совместимые компиляторы могут обнаруживать result_type автоматически, но будут придерживаться result_type, если он будет определен. (См. boost::visitor_ptr для решения использовать функции в качестве посетителей.)
  • Если result_type не void, то каждая операция объекта функции должна вернуть значение, подразумеваемое к result_type.
Examples

Следующий класс удовлетворяет требованиям статического посетителя нескольких типов (т.е. явно: int и std::string; или, например, имплицитно: short и const char *; и т.д.):

class my_visitor
    : public boost::static_visitor<int>
{
public:
    int operator()(int i)
    {
        return i * 2;
    }
    int operator()(const std::string& s)
    {
        return s.length();
    }
};

Другим примером является следующий класс, оператор функции-звонка которого является шаблоном-членом, позволяющим ему работать на значениях многих типов. Таким образом, следующий класс является посетителем любого типа, который поддерживает потоковый выход (например, int, ДП, std::string и т.д.):

class printer
    : public boost::static_visitor<>
{
    template <typename T>
    void operator()(const T& t)
    {
        std::cout << t << std::endl;
    }
};

C++14 совместимые компиляторы обнаруживают результат_type автоматически:

    boost::variant<int, float> v;
    // ...
    boost::apply_visitor(
        [](auto val) { return std::to_string(val); },
        v
    );

OutputStreamable

Требования к output streamable тип T следующие:

  • Для любого объекта t типа T, std::cout << t должно быть действительным выражением.

Hashable

Требования к hashable тип T следующие:

  • Для любого объекта t типа T, boost::hash должно быть действительным выражением.

Этот заголовок существует просто как удобство для пользователя, включая все заголовки в каталоге boost/variant за исключением .

Предоставляет вперед декларации boost::variant, boost::make_variant_over, boost::make_recursive_variant, и boost::make_recursive_variant_over шаблоны класса и boost::recursive_variant_ тип тега. Также определяется несколько предпроцессорных символов, как описано ниже.

BOOST_VARIANT_LIMIT_TYPES
BOOST_VARIANT_DO_NOT_USE_VARIADIC_TEMPLATES
BOOST_VARIANT_ENUM_PARAMS(param)
BOOST_VARIANT_ENUM_SHIFTED_PARAMS(param)
BOOST_VARIANT_NO_TYPE_SEQUENCE_SUPPORT
BOOST_VARIANT_NO_FULL_RECURSIVE_VARIANT_SUPPORT
namespace boost {
  template<typename T1, typename T2 = unspecified, ..., 
           typename TN = unspecified> 
    class variant;
  template<typename Sequence> class make_variant_over;
  template<typename T1, typename T2, ..., typename TN> 
    void swap(variant<T1, T2, ..., TN> &, variant<T1, T2, ..., TN> &);
  template<typename ElemType, typename Traits, typename T1, typename T2, ..., 
           typename TN> 
    std::basic_ostream<ElemType,Traits> & 
    operator<<(std::basic_ostream<ElemType,Traits> &, 
               const variant<T1, T2, ..., TN> &);
  template<typename T1, typename T2, ..., typename TN> 
    std::size_t hash_value(const variant<T1, T2, ..., TN> &);
}
namespace boost {
  typedef unspecified recursive_variant_;
  template<typename T1, typename T2 = unspecified, ..., 
           typename TN = unspecified> 
    class make_recursive_variant;
  template<typename Sequence> class make_recursive_variant_over;
}
namespace boost {
  template<typename T> class recursive_wrapper;
  template<typename T> class is_recursive_wrapper;
  template<typename T> class unwrap_recursive_wrapper;
}
namespace boost {
  template<typename Visitor> class apply_visitor_delayed_t;
  template<typename Visitor> class apply_visitor_delayed_cpp14_t;
  template<typename Visitor, typename Variant> 
    typename Visitor::result_type apply_visitor(Visitor &, Variant &);
  template<typename Visitor, typename Variant> 
    typename Visitor::result_type apply_visitor(const Visitor &, Variant &);
  template<typename BinaryVisitor, typename Variant1, typename Variant2> 
    typename BinaryVisitor::result_type OR decltype(auto) 
    apply_visitor(BinaryVisitor &, Variant1 &, Variant2 &);
  template<typename BinaryVisitor, typename Variant1, typename Variant2> 
    typename BinaryVisitor::result_type OR decltype(auto) 
    apply_visitor(const BinaryVisitor &, Variant1 &, Variant2 &);
  template<typename MultiVisitor, typename Variant1, typename Variant2, 
           typename Variant3> 
    typename MultiVisitor::result_type OR decltype(auto) 
    apply_visitor(MultiVisitor &, Variant1 &, Variant2 &, Variant3 &, ...);
  template<typename MultiVisitor, typename Variant1, typename Variant2, 
           typename Variant3> 
    typename MultiVisitor::result_type OR decltype(auto) 
    apply_visitor(const MultiVisitor &, Variant1 &, Variant2 &, Variant3 &, 
                  ...);
  template<typename Visitor> 
    apply_visitor_delayed_t<Visitor> apply_visitor(Visitor &);
  template<typename Visitor> 
    apply_visitor_delayed_cpp14_t<Visitor> apply_visitor(Visitor &);
}

Предоставляет декларации apply_visitor для трех или более параметров variant.

BOOST_VARAINT_MAX_MULTIVIZITOR_PARAMS
namespace boost {
  template<typename MultiVisitor, typename Variant1, typename Variant2, 
           typename Variant3> 
    typename MultiVisitor::result_type OR decltype(auto) 
    apply_visitor /*three or more variant parameters*/(MultiVisitor &, 
                                                       Variant1 &, 
                                                       Variant2 &, 
                                                       Variant3 &, ...);
  template<typename MultiVisitor, typename Variant1, typename Variant2, 
           typename Variant3> 
    typename MultiVisitor::result_type OR decltype(auto) 
    apply_visitor /*three or more variant parameters*/(const MultiVisitor &, 
                                                       Variant1 &, 
                                                       Variant2 &, 
                                                       Variant3 &, ...);
}
namespace boost {
  class bad_get;
  template<typename U, typename T1, typename T2, ..., typename TN> 
    U * relaxed_get(variant<T1, T2, ..., TN> *);
  template<typename U, typename T1, typename T2, ..., typename TN> 
    const U * relaxed_get(const variant<T1, T2, ..., TN> *);
  template<typename U, typename T1, typename T2, ..., typename TN> 
    U & relaxed_get(variant<T1, T2, ..., TN> &);
  template<typename U, typename T1, typename T2, ..., typename TN> 
    const U & relaxed_get(const variant<T1, T2, ..., TN> &);
  template<typename U, typename T1, typename T2, ..., typename TN> 
    U * strict_get(variant<T1, T2, ..., TN> *);
  template<typename U, typename T1, typename T2, ..., typename TN> 
    const U * strict_get(const variant<T1, T2, ..., TN> *);
  template<typename U, typename T1, typename T2, ..., typename TN> 
    U & strict_get(variant<T1, T2, ..., TN> &);
  template<typename U, typename T1, typename T2, ..., typename TN> 
    const U & strict_get(const variant<T1, T2, ..., TN> &);
  template<typename U, typename T1, typename T2, ..., typename TN> 
    U * get(variant<T1, T2, ..., TN> *);
  template<typename U, typename T1, typename T2, ..., typename TN> 
    const U * get(const variant<T1, T2, ..., TN> *);
  template<typename U, typename T1, typename T2, ..., typename TN> 
    U & get(variant<T1, T2, ..., TN> &);
  template<typename U, typename T1, typename T2, ..., typename TN> 
    const U & get(const variant<T1, T2, ..., TN> &);
}
namespace boost {
  class bad_polymorphic_get;
  template<typename U, typename T1, typename T2, ..., typename TN> 
    U * polymorphic_relaxed_get(variant<T1, T2, ..., TN> *);
  template<typename U, typename T1, typename T2, ..., typename TN> 
    const U * polymorphic_relaxed_get(const variant<T1, T2, ..., TN> *);
  template<typename U, typename T1, typename T2, ..., typename TN> 
    U & polymorphic_relaxed_get(variant<T1, T2, ..., TN> &);
  template<typename U, typename T1, typename T2, ..., typename TN> 
    const U & polymorphic_relaxed_get(const variant<T1, T2, ..., TN> &);
  template<typename U, typename T1, typename T2, ..., typename TN> 
    U * polymorphic_strict_get(variant<T1, T2, ..., TN> *);
  template<typename U, typename T1, typename T2, ..., typename TN> 
    const U * polymorphic_strict_get(const variant<T1, T2, ..., TN> *);
  template<typename U, typename T1, typename T2, ..., typename TN> 
    U & polymorphic_strict_get(variant<T1, T2, ..., TN> &);
  template<typename U, typename T1, typename T2, ..., typename TN> 
    const U & polymorphic_strict_get(const variant<T1, T2, ..., TN> &);
  template<typename U, typename T1, typename T2, ..., typename TN> 
    U * polymorphic_get(variant<T1, T2, ..., TN> *);
  template<typename U, typename T1, typename T2, ..., typename TN> 
    const U * polymorphic_get(const variant<T1, T2, ..., TN> *);
  template<typename U, typename T1, typename T2, ..., typename TN> 
    U & polymorphic_get(variant<T1, T2, ..., TN> &);
  template<typename U, typename T1, typename T2, ..., typename TN> 
    const U & polymorphic_get(const variant<T1, T2, ..., TN> &);
}
namespace boost {
  class bad_visit;
}
namespace boost {
  template<typename ResultType> class static_visitor;
}
namespace boost {
  template<typename T, typename R> class visitor_ptr_t;
  template<typename R, typename T> visitor_ptr_t<T,R> visitor_ptr(R (*)(T));
}

PrevUpHomeNext

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




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



:: Главная :: Chapter 42. Boost.Variant ::


реклама


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

Время компиляции файла: 2024-08-30 11:47:00
2025-05-19 17:49:42/0.0085928440093994/0