- Я использую вектор 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? }
Как напечатать вектор boost::any, когда у меня есть типы элементов, хранящиеся в другом векторе строк?
Ответы (1)
C++ — это статически типизированный язык. Каждое выражение должно иметь тип, известный во время во время компиляции.
Значение строки (или любой другой переменной, отличной от constexpr
) определяется во время выполнения. Таким образом, вы не можете выполнить приведение к типу, названному строкой.
any
полезен только в том случае, если вы точно знаете, какой тип был сохранен в этом конкретном значении. И вы должны знать это во время во время компиляции, а не во время выполнения. Это для сокрытия типа данных между человеком, выдающим значение, и человеком, который его получает. Но нельзя нарушать правила статической типизации C++.
Не существует универсального решения для хранения любого типа в массиве и последующего выполнения над ними произвольных операций. Вы можете разработать такой тип, как any
, который сможет использовать полиморфный доступ к фактическому типу для вызова operator<<
для значения. Но вы не можете сделать это снаружи any
.