具有在编译时定义的不同类型的向量
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:
#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)
我的问题比较简短:
我需要一个包含不同类型的向量,例如:
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:
#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)