Вектор с различными типами, определенными во время компиляции
Мой вопрос довольно короткий:
Мне нужен вектор, который содержит различные типы, такие как:
std::vector<int,double> vec;
vec.emplace_back((int) 1);
vec.emplace_back((double) 2.0);
Я попытался использовать boost: варианте, но проблема в том, что каждый раз, когда кто-то хочет использовать значения, нужно посещать / выводить числа из вектора.
Я определяю начальные значения для вектора, поэтому типы являются статическими и определяются во время компиляции. Более того, я хочу иметь возможность перебирать их (поэтому я использую вектор - это также может быть карта или любой другой контейнер).
Я хочу использовать в программе векторные записи типа int или double, не используя boost::get или что-то в этом роде. Я думаю, что это должно быть возможно, потому что тип каждой записи полностью определен во время компиляции, но я не знаю, как заставить это работать.
double d=vec[1]*3.0; //this should somehow work
int i=vec[0]*8; //this also without any get or anything
Я пытался использовать кортежи, но у меня нет большого опыта работы с ними, и, кажется, довольно сложно их перебирать.
for(auto &elem : vec) std::cout << elem << std:endl; //this or sth. similar should also work
Любая помощь высоко ценится.
1 ответ
Вы должны действительно использовать кортеж. CPP - это строгий типизированный язык. Смирись с этим.
Теперь, если вы хотите повторить, рассмотрите возможность использования Boost Fusion:
#include <boost/tuple/tuple.hpp>
#include <boost/tuple/tuple_io.hpp>
#include <boost/fusion/algorithm.hpp>
#include <boost/fusion/adapted/boost_tuple.hpp>
#include <boost/phoenix.hpp>
using namespace boost;
using namespace boost::phoenix::arg_names;
#include <iostream>
int main() {
tuple<int, double, std::string> demo(42, 3.1415, "hello pie universe");
fusion::for_each(demo, std::cout << arg1 << "\n");
auto& v2 = get<1>(demo);
v2 *= 10;
std::cout << "\nNew v2: " << v2 << "\n";
std::cout << "Tuple after edit: " << demo << "\n";
}
Какие отпечатки
42
3.1415
hello pie universe
New v2: 31.415
Tuple after edit: (42 31.415 hello pie universe)