【发布时间】:2017-12-24 10:44:53
【问题描述】:
我一直在从事一个小项目,以快速了解可变参数模板。我实现了一个小的多维数组。我现在想定义一个对给定位置的最近邻居进行操作的函数——有没有一种优雅的方法来检索我的数组中给定位置的邻居的值?
template<class T, size_t size, size_t... sizes>
struct MArr {
typedef std::array<typename MArr<T, sizes...>::type, size> type;
std::array<MArr<T, sizes...>,size> data;
MArr<T, sizes...>& operator[](int i) {
return data[i];
}
};
template<class T, size_t size>
struct MArr<T, size> {
typedef std::array<T, size> type;
type data;
T& operator[](int i) {
return data[i];
}
};
附录:我有点清楚如何通过使用递归来循环所有元素,例如将任意函数应用于超暗淡。整数数组:
template <typename T, size_t size>
void func(MArr<T, size>& arr, std::function<void(int &)> f) {
for (int i = 0; i < size; i++) {
f(arr[i]);
}
}
template <typename T, size_t size0, size_t size1, size_t ...sizes>
void func(MArr<T, size0, size1, sizes...>& arr, std::function<void(int &)> f) {
for (int i =0; i < size0; i++) {
func<T, size1, sizes...>(arr[i], f);
}
}
我很好奇我将如何生成类似func(arr[i+1,j,k,…],arr[i-1,j,k,…],arr[i,j+1,k,…],arr[i,j-1,k,…],…) 和给定函数(比如添加相应的元素)。正如我所说,可变参数模板很新,我觉得我还没有正确的心态......
【问题讨论】:
-
那些是直接邻居还是对角线?即,一个 2D 单元有 4 个还是 8 个?
-
直接邻居 -- 所以在 1D -> 2, 2D -> 4, 3D -> 6 ...
-
在我看来
func基本合适。您需要做的就是删除循环,稍微调整索引并添加一个标志,如果您已经移动了 1 步。 -
你的心态似乎很到位。有一些小问题,例如使用
typedef而不是using和不必要地复制std::function,但你明白了它的要点。可能值得在 codereview.stackexchange.com 上发布,一旦它完成了您想要的操作。 -
@nwp,感谢您的评论。由于索引的长度可变,我不确定如何定义特定函数。你能再扩大一点吗?基本上我希望能够选择某个元素,然后在其所有邻居上调用一个函数......我认为如果我有固定数量的索引会相当容易,但在这种特殊情况下,我似乎有点迷失…
标签: c++ templates metaprogramming variadic-templates variadic-functions