实现函数模板以填充多维对象

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)

除了比理想情况更多的代码,这个解决方案是一个性能噩梦.最终,我必须寻找更好的方法.

Col*_*mbo 6

你可以写一个扁平的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)

演示.这是非贪婪的方法,将范围尽可能浅地传递给给定函数.