std :: array <float,4 =“”>到std :: array <double,4 =“”> cast

时间:2016-05-18 15:59:58

标签: c++

是否可以将std::array<float, 4>转换为std::array<double, 4>

例如:

http://coliru.stacked-crooked.com/a/d62b3846618e4f81

3 个答案:

答案 0 :(得分:2)

不,你不能把一个扔到另一个。它们是两种不相关的类型。您需要遍历源数组并在目标数组中设置每个相应的元素。

std::array<float, 4> float_array{ 0.0f, 10.0f, 20.0f, 30.0f };

std::array<double, 4> double_array;

for (std::size_t i = 0; i < float_array.size(); ++i)
    double_array[i] = float_array[i]

答案 1 :(得分:2)

你可以为它创建一个函数: live sample

template<typename Dest, typename Src, std::size_t N, std::size_t... Is>
auto convert_array_to_impl(const std::array<Src, N> &src, std::index_sequence<Is...>) {
    return std::array<Dest, N>{{static_cast<Dest>(src[Is])...}};
}

template<typename Dest, typename Src, std::size_t N>
auto convert_array_to(const std::array<Src, N> &src) {
    return convert_array_to_impl<Dest>(src, std::make_index_sequence<N>());
}
...
auto double_array = convert_array_to<double>(float_array);

此函数实现相对于循环的优点是,当目标类型不是默认构造时,它将起作用。如果情况永远不会出现这种情况,那么另一个答案中的循环就会更直接。

答案 2 :(得分:0)

类型不一样,因此您不能仅将一种类型转换为另一种类型。

您可以使用std::copy算法函数代替循环。

#include <algorithm>
//..
std::array<float, 4> f4;
std::array<double, 4> d4;

//.. float to double
std::copy(f4.begin(), f4.end(), d4.begin()); 

// double to float
std::copy(d4.begin(), d4.end(), f4.begin());