Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在编译时定义了不同类型的向量_C++_Variables_Boost_Vector_Compile Time - Fatal编程技术网

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)