Библиотека предоставляет концепцию конструктивного , позволяющую любому захватывать конструкторы. Единый аргумент шаблона должен быть подписью функции. Тип возврата должен быть заполнителем, определяющим тип, который должен быть построен. Аргументы — это аргументы конструктора.
typedefmpl::vector<copy_constructible<_a>,copy_constructible<_b>,copy_constructible<_c>,constructible<_a(const_b&,const_c&)>>construct;typedefmpl::map<mpl::pair<_a,std::vector<double>>,mpl::pair<_b,std::size_t>,mpl::pair<_c,double>>types;any<construct,_b>size(std::size_t(10),make_binding<types>());any<construct,_c>val(2.5,make_binding<types>());any<construct,_a>v(size,val);// v holds std::vector<double>(10, 2.5);
Теперь предположим, что нам нужен конструктор по умолчанию? У нас не может быть конструктора по умолчанию , любой называет конструктор по умолчанию содержащегося типа, потому что у него не было бы способа узнать, что такое содержащийся тип. Итак, нам нужно будет передать информацию, связывающую заполнитель, явно.
typedefmpl::vector<copy_constructible<>,constructible<_self()>>construct;any<construct>x(std::string("Test"));any<construct>y(binding_of(x));// y == ""
Этот метод не ограничивается конструктором по умолчанию. Если конструктор принимает аргументы, они могут быть переданы после привязки.
Это преобразование нормально, поскольку требования common_any являются подмножеством требований any_printable. Преобразование в другом направлении является незаконным.
Чтобы получить ссылку, мы просто добавляем ссылку на placeholder.
inti;any<typeid_<>,_self&>x(i);any_cast<int&>(x)=5;// now i is 5
Note
_self по умолчанию placeholder, поэтому проще всего использовать _self&. Вместо этого можно использовать другой placeholder. any<typeid_<>,&> имеет точно такое же поведение.
Ссылки не могут быть восстановлены. Так же, как и встроенная ссылка на C++, после инициализации вы не можете изменить ее, чтобы указать на что-то другое.
Это применимо только тогда, когда ссылка построена из значения. Если ссылка построена из другой ссылки, новая ссылка не зависит от старой.
any<requirements>x(10);boost::shared_ptr<any<requirements,_self&>>p(newany<requirements,_self&>(x));any<requirements,_self&>y(*p);// equivalent to y(x);p.reset();++y;// okay
Поддерживаются ссылки как на const, так и на non-const.
Ссылка на не-const может быть преобразована в ссылку на const, но не наоборот. Естественно, мы не можем применить мутационные операции к ссылке на const.
В большинстве случаев использование любого имеет тот же синтаксис, что и использование основного объекта. Однако есть несколько случаев, когда это невозможно осуществить. Ссылка любой является прокси-сервером и не может использоваться в контекстах, где требуется реальная ссылка. В частности, forward_iterator не создает соответствующий ForwardIterator (если значение_type не установлено). Другое различие заключается в том, что все операции, которые не принимают по крайней мере один аргумент любой аргумент , должны быть переданы с информацией типа явно. Статические функции и конструкторы могут попасть в эту категорию. Все это означает, что общие алгоритмы могут не работать при применении к аргументам любым.
Статья Using Any раздела The Boost C++ Libraries BoostBook Documentation Subset Chapter 37. Boost.TypeErasure может быть полезна для разработчиков на c++ и boost.