Вектор с различными типами, определенными во время компиляции

Мой вопрос довольно короткий:

Мне нужен вектор, который содержит различные типы, такие как:

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)
Другие вопросы по тегам