【问题标题】:Vector with different types defined at compile time编译时定义的不同类型的向量
【发布时间】:2015-07-02 21:10:23
【问题描述】:

我的问题很简短:

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

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

非常感谢任何帮助。

【问题讨论】:

  • 没有boost::variant 之类的东西或它的一些变体是不可能的。
  • @AnT 你是说它的一些变体?哈哈
  • 正如@Ant 所说的那样,或者你必须有一个通用的基类并存储指针或智能指针。但即便如此,如果这些类没有共同点,你也必须dynamic_cast() 等。如果您需要重载 operator&lt;&lt;operator*,则所需的操作都将以某种方式工作
  • 我不知何故觉得这个向量首先不是解决潜在问题的好工具(当然只是猜测,因为我不知道潜在问题)。您可能应该有两个向量或直接获取实际数据类型。
  • 在您的示例中,您可以只使用双精度向量。

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


【解决方案1】:

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

【讨论】:

  • 你能解释一下我如何得到例如第二个值来进行计算吗?我可以在不更改类型的情况下更改值吗?它仍然有效吗?
  • 如果我要接受你的评论字面意思,那么是的,并且:demo
  • 也许提到这可以在不调用 boost 的情况下用 C++11 实现?
  • @Gerard 我不知道 c++11 中 fusion::for_each 的等价物(是的,phoenix 表达式可以替换为多态 lambda (c++14) 或多态函数对象;元组也可以是std::tuple。我也不认为std::tuple 实现io 流操作)
猜你喜欢
  • 2021-06-03
  • 1970-01-01
  • 1970-01-01
  • 2015-05-23
  • 1970-01-01
  • 1970-01-01
  • 2018-05-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多