提问人:suspiciously_large_carrot 提问时间:11/7/2023 最后编辑:suspiciously_large_carrot 更新时间:11/7/2023 访问量:89
使用 std::fill 与 std::integer_sequence 填充 std::数组
std::array filling using std::fill vs std::integer_sequence
问:
我真的没有任何问题,我只是有点好奇。我一直在浏览 SO 并看到了这篇文章
。这是一个非常酷的技巧,但它比普通的旧 std::fill 有什么优势吗?
我一直在快速工作台上玩它,似乎它在 -Og 和 -O3 的性能方面没有任何优势,显然它对可读性没有帮助。我想不出任何理由使用它。我是 c++ 的新手,也许我做错了什么,所以这是我的填充版本代码:
template<typename T, size_t N, typename... Ts>
auto make_fill_array(Ts&&... args) noexcept(std::is_nothrow_constructible<T>::value)
-> std::array<T, N> {
std::array<T, N> ret;
std::fill(ret.begin(), ret.end(), T{std::forward<Ts>(args)...});
return ret;
}
此外,还有一个用于容器的模板专用化,这些容器可以使用 std::initializer_list 构造,但这只是一些样板。
编辑: 我被问到使用情况。我并没有真正考虑过这段代码,因为它不是我个人项目的一部分,它只是个人的好奇心,所以我的测试就是这样简单的东西。
auto fillarray = make_fill_array<Point, 10>(1, 6);
或
auto fillarray2 = make_fill_array<std::vector<Point>, 5>(5, Point{1, 6});
答:
2赞
T.C.
11/7/2023
#1
这需要的不仅仅是电池组扩展解决方案。T
如果该类型不是默认可构造的,则将不起作用(至少对于 )。std::array<T, N> ret;
N > 0
如果它不可复制分配,那么它也将不起作用。(还具有成员功能。fill
std::array
fill
最后,如果它不能移动构造,那么就行不通。return ret;
评论
0赞
suspiciously_large_carrot
11/7/2023
嗯,这是有道理的。但我不明白最后一点,为什么它需要移动?它通常只是 NRVOed,即使 NRVO 不会启动,它不会只是复制吗?
上一个:模板部分规范
评论
T
T