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 если и только если каждый из его ограниченных типов отвечает требованиям концепции.
Требования к статическому посетителю типа 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;
}
};
namespaceboost{template<typename MultiVisitor,typename Variant1,typename Variant2,typename Variant3>typenameMultiVisitor::result_typeORdecltype(auto)apply_visitor/*three or more variant parameters*/(MultiVisitor&,Variant1&,Variant2&,Variant3&,...);template<typename MultiVisitor,typename Variant1,typename Variant2,typename Variant3>typenameMultiVisitor::result_typeORdecltype(auto)apply_visitor/*three or more variant parameters*/(constMultiVisitor&,Variant1&,Variant2&,Variant3&,...);}
Статья Reference раздела The Boost C++ Libraries BoostBook Documentation Subset Chapter 42. Boost.Variant может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.