Lin*_*gxi 2 c++ arrays multidimensional-array template-meta-programming c++14
用C++填充多维对象(数组,嵌套标准容器等)对我来说一直很烦人.通常使用嵌套循环.例如,要obj使用值填充三维对象v,您可以编写类似的内容
for (auto& x : obj) {
for (auto& y : x) {
for (auto& z : y) {
z = v;
}
}
}
Run Code Online (Sandbox Code Playgroud)
这样的循环是代码噪声,编写起来很繁琐,也妨碍了代码读取.我正在考虑编写一个函数模板来执行填充.理想情况下,使用这样的函数模板,您应该能够编写类似的东西
fill(obj, v);
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
目前,我有一个功能模板make_multi()来制作多维对象.所以你可以做到
// assuming `obj` is a 3x3x3 nested `std::vector`
obj = make_multi<std::vector>(v, 3, 3, 3);
Run Code Online (Sandbox Code Playgroud)
除了比理想情况更多的代码,这个解决方案是一个性能噩梦.最终,我必须寻找更好的方法.
你可以写一个扁平的foreach:
namespace detail {
template <typename Range, typename Func>
constexpr auto flat_foreach(Range&& r, Func& f, int)
-> decltype(void(f(std::forward<Range>(r)))) {f(std::forward<Range>(r));}
template <typename Range, typename Func>
constexpr void flat_foreach(Range&& r, Func& f...) {
for (auto&& i : r)
flat_foreach(std::forward<decltype(i)>(i), f, 0);
}
}
template <typename Range, typename Func>
constexpr void flat_foreach(Range&& r, Func f)
{detail::flat_foreach(std::forward<Range>(r), f, 0);}
Run Code Online (Sandbox Code Playgroud)
演示.这是非贪婪的方法,将范围尽可能浅地传递给给定函数.
| 归档时间: |
|
| 查看次数: |
83 次 |
| 最近记录: |