如何将 std::array<double, 100> 转换为 std::array<float, 100> ? (避免明显的样板实施)

How to convert std::array<double, 100> to std::array<float, 100> ? (avoiding obvious boilerplate implementation)

假设我有一个 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 std::array<float, 100> f_array;

因此破坏了 const 正确的代码。

我怀疑是否有一行解决方案,但有两行:

std::array<float, 100> f_array;
std::copy(d_array.begin(), d_array.end(), f_array.begin());

参见std::copy

你可以写一个简单的转换函数。据我所知,没有任何现有的标准或提升功能,但实现起来相当简单:

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)

即可使用

Example

同时 Miles Budnek's solves OP's problem, it may fail if the array is too big (note that you are asking the compiler to generate and execute a function with N parameters). See e.g. this 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.