Как напечатать вектор boost::any, когда у меня есть типы элементов, хранящиеся в другом векторе строк?

  • Я использую вектор boost::any для хранения различных типов данных, чтобы построить таблицу символов из заданного файла программы.
  • Я также храню их типы данных в отдельном векторе в виде строк.
  • при попытке напечатать boost::any с помощью boost::any_cast‹>(), если я передам тип данных, хранящийся в виде строки, в качестве типа приведения, я получаю ошибку bad_any_cast.
  • Как преодолеть это препятствие и напечатать вектор с информацией о типе, которая у меня есть в виде строк.

    vector<boost::any> vany;
    vector<string> vtype;
    string vartype;
    
    vany.push_back(10);
    vtype.push_back("int");
    vany.push_back(2.5);
    vtype.push_back("float");
    vany.push_back("hello");
    vtype.push_back("string");
    
    for(int i=0; i<3; i++)
    {
        vartype = vtype[i];
        cout<<boost::any_cast<vartype>(vany[i]); //this doesn't work, how do i make it work?
    }        
    

person Tauseef    schedule 06.02.2016    source источник


Ответы (1)


C++ — это статически типизированный язык. Каждое выражение должно иметь тип, известный во время во время компиляции.

Значение строки (или любой другой переменной, отличной от constexpr) определяется во время выполнения. Таким образом, вы не можете выполнить приведение к типу, названному строкой.

any полезен только в том случае, если вы точно знаете, какой тип был сохранен в этом конкретном значении. И вы должны знать это во время во время компиляции, а не во время выполнения. Это для сокрытия типа данных между человеком, выдающим значение, и человеком, который его получает. Но нельзя нарушать правила статической типизации C++.

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

person Nicol Bolas    schedule 06.02.2016
comment
stackoverflow.com /вопросы/3224915/ - person Captain Giraffe; 06.02.2016
comment
+1 за эту дублирующую ссылку :) Мне удалось перегрузить оператор ‹‹, чтобы решить мою задачу. Но я столкнулся с проблемой при попытке чтения из файла в boost::any. (пример) boost::любое значение; файл ›› значение; // выдает ошибку Я думаю, мне нужна какая-то перегрузка для оператора ›› сейчас. Вы знаете что-то, что может помочь? - person Tauseef; 06.02.2016