将std::vector<int>转换为std::vector<enum>。

3

我有一个数组std::vector<int>和一个enum class Foo : int。有没有比使用reinterpret_cast更好的强制转换方法?

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

为什么要将容器强制转换而不是元素?我不确定你能在这个例子中使用reinterpret_cast。 - cplusplusrat
4
如果reinterpret_cast 能够运行,那只是因为你运气好。在访问单个索引时进行强制转换。或者复制向量并逐个复制每个元素并进行强制转换。 - selbie
4
有一个专门设计用于此目的的算法函数叫做std::transform - PaulMcKenzie
谢谢,知道了! - Daniel Stephens
std::vector<Foo> fv; std::transform(v.begin(), v.end(), std::back_inserter(fv), [&](int n) { return n_converted_to_a_Foo;}); 这个简单的代码可以创建一个新的 Foo 向量,其内容基于 v 向量。如果您认可这种方法,我可以将其作为答案发布。 - PaulMcKenzie
@PaulMcKenzie 在这种情况下,这是唯一可接受的方法。不能直接使用原始向量,必须制作副本,否则代码将具有未定义的行为。 - Remy Lebeau
1个回答

8

static_caststd::transform结合使用。

https://godbolt.org/z/M6ofkF

#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;
}

参考文献: 如何在C++中将int类型转换为枚举类型?


非常遗憾,实际上它确实执行计算(在gcc12和Clang13中),尽管这些计算绝对没有任何作用,并且应该被优化成简单的复制赋值。这个事实让我有点不想在第一次使用枚举时将它们放入向量中... - Adomas Baliuka
这种方法的问题在于,不属于枚举的值也会被转换。https://godbolt.org/z/crrj6sv1f - nvd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接