英文:
How to create an array of N floats values with fold expression?
问题
以下是翻译好的部分:
假设以下函数:
template<size_t N>
constexpr std::array<float, N> make_ones()
{
std::array<float, N> ret{};
for (size_t k = 0; k != N; ++k)
{
ret[k] = 1.0f;
}
return ret;
}
是否可以使用折叠表达式(fold expression)编写这个函数?问题是我没有一个可展开的参数包。
英文:
Suppose the following function
template<size_t N>
constexpr std::array<float, N> make_ones()
{
std::array<float, N> ret{};
for (size_t k = 0; k != N; ++k)
{
ret[k] = 1.0f;
}
return ret;
}
Is it possible to write that with a fold expression?
The problem is that I do not have a pack to expand.
答案1
得分: 4
不可用fold expression,但可以使用pack expansion和*index sequence*,在[tag:C++20]中,您可以这样做:
template <size_t N>
constexpr std::array<float, N> make_ones()
{
return []<size_t... Is>(std::index_sequence<Is...>) {
return std::array<float, sizeof...(Is)>{( static_cast<void>(Is), 1.0f)...};
}(std::make_index_sequence<N>{});
}
对于不支持C++20或更高版本的编译器,您可以这样做:
template <size_t... Is>
constexpr std::array<float, sizeof...(Is)> make_ones_impl(std::index_sequence<Is...>)
{
return std::array<float, sizeof...(Is)>{(static_cast<void>(Is), 1.0f)...};
}
template<size_t N>
constexpr std::array<float, N> make_ones()
{
return make_ones_impl(std::make_index_sequence<N>{});
}
英文:
>Is it possible to write that with a fold expression?
Not with fold expression but pack expansion as well as with index sequence, in [tag:C++20] you could do:
template <size_t N>
constexpr std::array<float, N> make_ones()
{
return []<size_t... Is>(std::index_sequence<Is...>) {
return std::array<float, sizeof...(Is)>{( static_cast<void>(Is), 1.0f)...};
}(std::make_index_sequence<N>{});
}
For compilers that doesn't support C++20 or later, you might do
template <size_t... Is>
constexpr std::array<float, sizeof...(Is)> make_ones_impl(std::index_sequence<Is...>)
{
return std::array<float, sizeof...(Is)>{(static_cast<void>(Is), 1.0f)...};
}
template<size_t N>
constexpr std::array<float, N> make_ones()
{
return make_ones_impl(std::make_index_sequence<N>{});
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论