これは未定義の動作ですか?
std::array<int, 5> x = {3, 5, 1, 2, 3};
std::array<int, 3>& y = *reinterpret_cast<std::array<int, 3>*>(&x[1]);
for(int i = 0; i != 3; i++) {
std::cout << y[i] << "\n";
}
はいかもしれませんが、sをスライスする安全な方法があるはずだと本当に感じていますstd::array
。
編集: Radekの提案に従って:
template<unsigned N, unsigned start, unsigned end, typename T>
std::array<T, end - start>& array_slice(std::array<T, N>& x)
{
static_assert(start <= end, "start <= end");
static_assert(end <= N-1, "end <= N");
return *reinterpret_cast<std::array<T, end - start>*>(&x[start]);
}
編集:わかりました、私はstd::array
sに不満があると判断し、他の何かに移動します、何かアイデアはありますか?