簡體   English   中英

如何轉換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的double,並且希望將其轉換為float:

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)

雖然Miles Budnek答案解決了OP的問題,但如果數組太大,則可能會失敗(請注意,您要讓編譯器生成並執行帶有N個參數的函數)。 參見例如這個例子

另一種選擇是使用簡單的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;
}

這里

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM