我真的没有任何问题,我只是有点好奇。我一直在浏览SO并看到this
邮政。这是一个非常酷的技巧,但是它比普通的旧 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});
最佳答案
这需要更多 T
比包扩展解决方案。
如果类型不可默认构造,std::array<T, N> ret;
不起作用(至少对于 N > 0
)。
如果它不可复制分配,则 fill
也行不通。 (std::array
也有一个 fill
成员函数。)
最后,如果它不可移动构造,则 return ret;
行不通。
关于c++ - 使用 std::fill 与 std::integer_sequence 进行 std::array 填充,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77433300/