gpt4 book ai didi

c++ - 如何构造一个填充了一些统一值的 std::array ?

转载 作者:行者123 更新时间:2023-12-03 06:50:09 26 4
gpt4 key购买 nike

std::array可以使用特定值构造(在编译时使用较新的 C++ 版本),例如

std::array a{1, 4, 9};
但是 - 它没有构造函数,或命名为构造函数惯用语的标准库,采用单个值并复制它。即我们没有:
std::array<int, 3> a{11};
// a == std::array<int, 3>{11, 11, 11};
因此,我们如何构造一个仅给定重复值的数组?
编辑:我正在寻找一种解决方案,它甚至适用于不可默认构造的元素类型;因此,通过默认构造数组然后填充它的解决方案不是我所追求的 - 尽管这适用于 int 的情况。 (如示例中所示)。

最佳答案

我们可以写一个合适的named constructor idiom为达到这个
然而,实现有点笨拙,因为我们需要使用 "indices trick"在 C++11 中需要很多样板,所以让我们假设 C++14:

namespace detail {

template<size_t, class T>
constexpr T&& identity(T&& x) { return std::forward<T>(x); }

template<class T, size_t... Indices>
constexpr auto array_repeat_impl(T&& x, std::index_sequence<Indices...>)
{
return std::experimental::make_array(identity<Indices>(x)...);
}

} // end detail

template<size_t N, class T>
constexpr auto array_repeat(T&& x)
{
return detail::array_repeat_impl(std::forward<T>(x), std::make_index_sequence<N>());
}
看到这个工作 GodBolt .
如果你可以编译你的代码 C++20,你可以放弃对 make_array 的依赖。和写:
namespace detail {

template<size_t, class T>
constexpr T&& identity(T&& x) { return std::forward<T>(x); }

template<class T, size_t... Indices>
constexpr auto array_repeat_impl(T&& x, std::index_sequence<Indices...>)
{
return std::array{identity<Indices>(x)...};
}

} // end detail

template<size_t N, class T>
constexpr auto array_repeat(T&& x)
{
return detail::array_repeat_impl(std::forward<T>(x), std::make_index_sequence<N>());
}
GodBolt
笔记:
  • 这个解决方案有点类似于 Jared Hoberock 的 tuple_repeat ,他的一部分 tuple utilities for C++11 .
  • 感谢@Caleth 和@L.F.用于在 array_repeat_impl 中指出不当转发.
  • 关于c++ - 如何构造一个填充了一些统一值的 std::array ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63821007/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com