我想写一个函数,它将n int
作为数组的坐标,每个坐标的最大值。此函数将这些参数线性化以定位特定索引。
int my_func(int x, int y, int XMAX, int YMAX){
return x + y*XMAX;
}
这是一个2D示例,但由于变量模板非常容易,我可以创建一些通用的东西。 但是,当我想要为参数中的每个坐标不采用最大值的相同功能时,我被困住了。 这样的事情:
template<int XMAX, int YMAX>
int my_func(int x, int y){
return x + y*XMAX;
}
这里它适用于2D,但我想概括从1到N维,我不知道如何实现这一点。
我正在考虑传递一个int N
,它是维数和std::array<N, int>::iterator
,它是包含实际最大值的std::array
上的迭代器,但它不会编译。
这是代码:
template <int N, std::array<size_t, N>::iterator it>
void foo(){...}
它说’std::array<long unsigned int, N>::iterator’ is not a type
。
如果我只是通过std::array
,则会收到以下错误:’struct std::array<long unsigned int, N>’ is not a valid type for a template non-type parameter
有人知道如何解决这样的问题吗?我正在使用C ++ 11(G ++ 5.4.0)。
答案 0 :(得分:1)
首先,我想你在函数中犯了一个小错误,因为如果你需要线性化数组的访问,你需要多次使用XMAX
int my_func(int x, int y, int XMAX, int YMAX){
return x + y*XMAX;
}
因为每行都由XMAX项组成。为了回答您的问题,我使用了模板参数包
template <int N>
int my_func(int x)
{
assert(x < N);
return x;
}
template <int N, int... Ns, typename ARG, typename... ARGS>
ARG my_func (ARG x, ARGS... args)
{
assert(x < N);
return x + N*my_func<Ns...>(args...);
}
int main()
{
int a = 1;
int b = 2;
int c = my_func<10, 3>(a, b);
}
第一个函数是递归的基础,第二个函数使用两个参数包,还有2个显式模板参数,使递归成为可能。