【问题标题】:std::vector<int> to std::vector<enum>std::vector<int> 到 std::vector<enum>
【发布时间】:2020-01-26 04:33:08
【问题描述】:

我有一个数组std::vector&lt;int&gt; 和一个enum class Foo : int。有没有比reinterpret_cast 更好的投射或转换方法?

std::vector<int> v;
auto& c = *reinterpret_cast<std::vector<Foo>*>(&v);

【问题讨论】:

  • 为什么要转换容器而不是元素?我不确定您是否可以像在此示例中那样使用 reinterpret_cast
  • 如果reinterpret_cast 有效,那只是因为你走运了。访问单个索引时进行强制转换。或者复制向量并复制每个元素并一次投射一个。
  • 有一个为此设计的算法函数叫做std::transform
  • 谢谢,很高兴知道!
  • std::vector&lt;Foo&gt; fv; std::transform(v.begin(), v.end(), std::back_inserter(fv), [&amp;](int n) { return n_converted_to_a_Foo;}); -- 简而言之,这就是您可能想要的。它将基于v 向量的内容创建一个新的 Foo 向量。如果这是可以接受的,我可以将其发布为答案。

标签: c++ c++11 c++14


【解决方案1】:

https://godbolt.org/z/M6ofkF

static_caststd::transform 组合在一起。

#include <algorithm>
#include <vector>
#include <cassert>

enum class Foo : int {
   A = 0,
   B = 1,
   C = 2,
   D = 3,
   E = 4,
   F = 5
};

std::vector<Foo> convert(std::vector<int> const &in) {
  std::vector<Foo> out;
  out.reserve(in.size());

  std::transform(in.begin(), in.end(), std::back_inserter(out),
                 [](int n) { return static_cast<Foo>(n); });
  return out;
}

int main() {
  std::vector<int> vec{1, 2, 3, 4, 5};
  std::vector<Foo> c = convert(vec);

  assert(c[3] == Foo::E);

  return 0;
}

参考:How to cast int to enum in C++?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-02
    • 2014-05-12
    • 2012-03-07
    相关资源
    最近更新 更多