2014-10-09 2 views
0

Недавно я начал использовать библиотеку C++ Boost, и я тестирую класс any, который может хранить любые типы данных. На самом деле я пытаюсь определить operator<<, чтобы легко распечатать содержимое любой переменной типа any (и, конечно же, класс содержимого должен содержать operator<<). Я только начал с образцов (int, double ...), потому что они отображаются по умолчанию. И до сих пор у меня есть этот код:Cast boost :: любой экземпляр до его реального типа

#include <boost/any.hpp> 
#include <iostream> 
#include <string> 
using namespace std; 
using namespace boost; 

ostream& operator<<(ostream& out, any& a){ 
    if(a.type() == typeid(int)) 
     out << any_cast<int>(a); 
    else if(a.type() == typeid(double)) 
     out << any_cast<double>(a); 
    // else ... 
    // But what about other types/classes ?! 
} 

int main(){ 
    any a = 5; 
    cout << a << endl; 
} 

Так что проблема здесь в том, что я должен перечислять все возможные типы. Есть ли способ лить переменную в particular type, имеющую type_info этого particular type?

+1

Вы не можете перечислить «все возможные типы». Тип называется * any *, not * every *. –

+0

Возможно, вы можете использовать [Стирание типа Boost] (http://www.boost.org/doc/libs/1_55_0/doc/html/boost_typeerasure.html) для более конкретных потребностей стирания типа. Как бы то ни было, вопрос путается, потому что заголовок о кастинге (что, вероятно, неверно или не рекомендуется), тогда как тело - это форматирование, что является хорошо понятой и совершенно другой проблемой. –

+0

Я никогда не использовал 'boost :: any', и я написал довольно странный код. Вам также не нужно использовать его. Его используют _incredibly_ few. –

ответ

1

Boost.Any any

С boost::any вы не можете сделать это, как другие уже отмечали в комментариях. Это связано с тем, что boost::any забывает все о типе ценности, который он хранит, и требует, чтобы вы знали, какой тип там. Хотя у вас нет возможности перечислить все возможные типы.

Решение должно изменить boost::any так, чтобы он забыл все о типе значения, которое он хранит , за исключением как его выпустить. Mooing Duck предоставил одно решение в комментариях. Другим было бы написать новую версию boost::any, но расширить ее внутренности для поддержки операции потоковой передачи.

Boost.Spirit hold_any

Boost.Spirit уже дает что-то подобное в <boost/spirit/home/support/detail/hold_any.hpp>.

Boost.TypeErasure any

Гораздо лучший подход, однако, использовать Boost.TypeErasure «s any, как было упомянуто Kerrek SB в своем комментарии.

Пример для вашего случая (использование <<) будет выглядеть следующим образом:

#include <boost/type_erasure/any.hpp> 
#include <boost/type_erasure/operators.hpp> 
#include <iostream> 
#include <string> 

int main() { 
    typedef 
     boost::type_erasure::any< 
      boost::mpl::vector< 
       boost::type_erasure::destructible<>, 
       boost::type_erasure::ostreamable<>, 
       boost::type_erasure::relaxed 
      > 
     > my_any_type; 

    my_any_type my_any; 

    my_any = 5; 
    std::cout << my_any << std::endl; 
    my_any = 5.4; 
    std::cout << my_any << std::endl; 
    my_any = std::string("text"); 
    std::cout << my_any << std::endl; 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^