我有一个数组std::vector<int>
和一个enum class Foo : int
。有没有比使用reinterpret_cast
更好的强制转换方法?
std::vector<int> v;
auto& c = *reinterpret_cast<std::vector<Foo>*>(&v);
将static_cast
与std::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;
}
参考文献: 如何在C++中将int类型转换为枚举类型?
reinterpret_cast
能够运行,那只是因为你运气好。在访问单个索引时进行强制转换。或者复制向量并逐个复制每个元素并进行强制转换。 - selbiestd::transform
。 - PaulMcKenziestd::vector<Foo> fv; std::transform(v.begin(), v.end(), std::back_inserter(fv), [&](int n) { return n_converted_to_a_Foo;});
这个简单的代码可以创建一个新的Foo
向量,其内容基于v
向量。如果您认可这种方法,我可以将其作为答案发布。 - PaulMcKenzie