假设我有一个std::array
的双精度数,并且希望将其转换为浮点数:
std::array<double, 100> d_array{1,2,3};
std::array<float, 100> f_array; <--convert it from d_array;
如果使用std::vector
,则非常简单:
std::vector<float> f_array(d_array.begin(), d_array.end());
我知道std::array
是一种聚集的类型,所以看来我必须当场进行一些手动跳转才能将其复制到数组中,或者是否有一种简便的方法?
我也考虑std::copy
样板,例如:
std::array<float, 100> f_array;
std::copy(d_array.begin(), d_array.end(), f_array.begin());
这并不比矢量版本简单,并且不能为const:
const std::array<float, 100> f_array;
因此破坏了经过const校正的代码。
答案 0 :(得分:3)
我怀疑是否存在一线解决方案,但存在两行:
std::array<float, 100> f_array;
std::copy(d_array.begin(), d_array.end(), f_array.begin());
请参见std::copy
。
答案 1 :(得分:3)
您可以编写一个简单的转换函数。我不知道任何现有的标准或增强功能,但是实现起来非常简单:
template <typename T, typename U, size_t N, size_t... Is>
std::array<T, N> array_cast(const std::array<U, N>& arr, std::index_sequence<Is...>) {
return { static_cast<T>(arr[Is])... };
}
template <typename T, typename U, size_t N>
std::array<T, N> array_cast(const std::array<U, N>& arr) {
return array_cast<T>(arr, std::make_index_sequence<N>());
}
要使用,只需致电array_cast<float>(d_array)
答案 2 :(得分:2)
尽管Miles Budnek的answer解决了OP的问题,但是如果数组太大(它可能要求编译器生成并执行带有N个参数的函数),则可能会失败。参见例如这个example。
另一种选择是使用简单的for
循环,由于C ++ 14,它可以在constexpr
函数中使用。
template< class R, class T, size_t N>
constexpr std::array<R, N> array_copy(std::array<T, N> const &src)
{
std::array<R, N> tmp {};
for (size_t i{}; i < N; ++i)
tmp[i] = static_cast<R>(src[i]);
return tmp;
}
实时HERE。