std::array
可以用特定的值构造(在编译时用较新的C++版本),例如
std::array a{1, 4, 9};
然而,它没有构造函数,或者标准库命名的构造函数习惯用法,取单个值并复制它。也就是说,我们没有:
std::array<int, 3> a{11};
// a == std::array<int, 3>{11, 11, 11};
因此,我们如何构造一个只给出了要重复的值的数组呢?
**编辑:**我正在寻找一个解决方案,这将工作,甚至为元素类型是不可默认构造的;因此,经过默认设置的解决方案-构造数组,然后填充它,并不是我所追求的-尽管事实上这将适用于int
的情况(如示例中所示)。
2条答案
按热度按时间4ngedf3f1#
我们可以编写一个合适的命名构造函数来实现这一点。然后,你的示例定义如下所示:
然而,这个实现有点笨拙,因为我们需要使用"indices trick",而"indices trick"在C11中需要大量的样板文件,所以让我们假设C14:
在GodBolt上可以看到这一点。
如果你能用C++20编译你的代码,你可以去掉对
make_array
的依赖并写上:GodBolt
注:
tuple_repeat
,它是tuple utilities for C++11的一部分。array_repeat_impl
中的不适当转发。array_repert()
函数接受右值引用并从中移动,所以在参数中创建一个临时变量是可以的,即使代价很高。o75abkj42#
在C++20中,当类型是可默认构造和可复制的时,你可以直接使用now-constexpr
fill
函数(live example)来为这个类型创建一个helper:这可能会降低效率,但这是否是一个问题取决于您。