2013-06-23 2 views
0

Я успешно выполнил следующий фрагмент кода, используя boost::variant<string, float>. Однако, когда я пытался использовать boost::any вместо этого, я сталкиваюсь рассогласования ошибку операнда в cout<< инструкции, кусок кода:Разница между boost :: any и boost :: variant, когда мы используем cout <<

for(vector<vector<vector<boost::any>>>::const_iterator i = masterList.begin(); i != masterList.end(); ++i) 
{ 
    for(vector<vector<boost::any>>::const_iterator j = i->begin(); j != i->end(); ++j) 
    { 
     for(vector<boost::any>::const_iterator k = j->begin(); k != j->end(); ++k) 
     { 
      cout<<*k<<' '; 
     } 
    } 
} 

ответ

2

Boost.Any предлагает полный тип стиранию, все характеристики (такие, как потоковое к std::ostream) из базовый тип стирается. Единственный способ вернуть тип - использовать функции any_cast.

Если вы хотите стереть стирание частичного типа, посмотрите на библиотеку Steven Watanabe от Boost.TypeErasure. Обратите внимание, что TypeErasure является официальной библиотекой Boost с Boost 1.54.

+2

[Boost.TypeErasure] (http://www.boost.org/doc/libs/1_54_0_beta1/doc/html/boost_typeerasure.html) был добавлен в последнюю бета-версию и должен быть официальной частью Boost менее чем за месяц (при условии, что никаких серьезных проблем не будет поднято). – Mankarse

+0

@Mankarse: Обновлены ссылки, так как Boost 1.54 теперь выпущен с помощью библиотеки TypeErasure. – dalle