如何将 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:
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'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.
假设我有一个 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 正确的代码。
我怀疑是否有一行解决方案,但有两行:
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's
另一种方法是使用简单的 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.