C++ 在编译时定义了不同类型的向量
我的问题相当简短: 我需要一个包含不同类型的向量,如:C++ 在编译时定义了不同类型的向量,c++,variables,boost,vector,compile-time,C++,Variables,Boost,Vector,Compile Time,我的问题相当简短: 我需要一个包含不同类型的向量,如: std::vector<int,double> vec; vec.emplace_back((int) 1); vec.emplace_back((double) 2.0); 我尝试过使用元组,但我对它们没有太多经验,而且似乎很难对它们进行迭代 for(auto &elem : vec) std::cout << elem << std:endl; //this or sth. similar
std::vector<int,double> vec;
vec.emplace_back((int) 1);
vec.emplace_back((double) 2.0);
我尝试过使用元组,但我对它们没有太多经验,而且似乎很难对它们进行迭代
for(auto &elem : vec) std::cout << elem << std:endl; //this or sth. similar should also work
对于(auto&elem:vec)std::cout您确实应该使用元组。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";
}
你确实应该使用元组。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";
}
如果没有类似于boost::variant或它的一些变体,这是不可能的。@你是说它的一些变体吗?har Haras@Ant说,或者您必须有一个公共基类并存储指针或智能指针。但即使这样,如果类没有共同点,您也必须动态\u cast()
,等等。如果您需要重载operator,那么您可能会有一种感觉,即这个向量首先不是解决潜在问题的好工具(当然只是一个猜测,因为我不知道潜在问题)。您可能应该有两个向量,或者直接得到实际的数据类型。在您的示例中,您可以只使用一个双精度向量。如果没有像boost::variant
这样的东西或它的一些变体,这是不可能的。@您是指它的一些变体吗?har Haras@Ant说,或者您必须有一个公共基类并存储指针或智能指针。但即使这样,如果类没有共同点,您也必须动态\u cast()
,等等。如果您需要重载operator,那么您可能会有一种感觉,即这个向量首先不是解决潜在问题的好工具(当然只是一个猜测,因为我不知道潜在问题)。你可能应该有两个向量或者直接得到实际的数据类型。在你的例子中,你可以只使用一个双精度向量。你能解释一下我如何得到第二个值来进行计算吗?我可以在不更改类型的情况下更改值吗?如果我接受您的注释文字,那么是的,并且:也许可以提到,在不调用boost的情况下,使用C++11可以实现这一点?@Gerard我不知道C++11中fusion::for_each的等价形式(是的,phoenix表达式可以用多态lambda(C++14)替换)或者一个多态函数对象;元组也可以是std::tuple
。我也不认为std::tuple
实现io流式操作符)你能解释一下我是如何得到第二个值来进行计算的吗?我可以在不更改类型的情况下更改值吗?如果我接受您的注释文字,那么是的,并且:也许可以提到,在不调用boost的情况下,使用C++11可以实现这一点?@Gerard我不知道C++11中fusion::for_each的等价形式(是的,phoenix表达式可以用多态lambda(C++14)替换)或者一个多态函数对象;元组也可以是std::tuple
。我也不认为std::tuple
实现io流操作符)
42
3.1415
hello pie universe
New v2: 31.415
Tuple after edit: (42 31.415 hello pie universe)