具有在编译时定义的不同类型的向量

Vector with different types defined at compile time

我的问题比较简短:

我需要一个包含不同类型的向量,例如:

std::vector<int,double> vec;
vec.emplace_back((int) 1);
vec.emplace_back((double) 2.0);

我尝试使用 boost:variant,但问题是每次要使用值时都必须 visit/get 向量中的数字。

我为向量定义了初始值,因此类型是静态的,并且是在编译时定义的。此外,我希望能够遍历它们(这就是我使用矢量的原因——它也可以是地图或任何其他容器)。

我想要的是在程序中使用像 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

非常感谢任何帮助。

你确实应该使用元组。 CPP 是一种强类型语言。处理一下。

现在,如果您想迭代,请考虑使用 Boost Fusion:

Live On Coliru

#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)