现在我有这个代码:
uint64_t buffer = 0;
const uint8_t * data = reinterpret_cast<uint8_t*>(&buffer);
这可行,但由于悬挂指针似乎有风险(而且看起来也很丑)。我不希望赤裸裸的指针坐在那里。我想做这样的事情:
uint64_t buffer = 0;
const std::array<uint8_t, 8> data = partition_me_softly(buffer);
是否有 c++11 风格的构造允许我将它放入一个安全的容器中,最好是std::array
一个unsigned int
这样的容器而不引起开销?
如果不是,那么改进此代码以使其更安全的理想方法是什么?
所以我修改了 dauphic 的答案更通用一点:
template <typename T, typename U>
std::array<T, sizeof(U) / sizeof(T)> ScalarToByteArray(const U v)
{
static_assert(std::is_integral<T>::value && std::is_integral<U>::value,
"Template parameter must be a scalar type");
std::array<T, sizeof(U) / sizeof(T)> ret;
std::copy((T*)&v, ((T*)&v) + sizeof(U), ret.begin());
return ret;
}
这样您就可以将它与更多类型一起使用,如下所示:
uint64_t buffer = 0;
ScalarToByteArray<uint8_t>(buffer);