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

时间:2015-07-02 21:10:24

标签: c++ variables boost vector compile-time

我的问题很简短:

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

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

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

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

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

答案 0 :(得分:0)

你应该确实使用元组。 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)