C++11 模板专门化中的std::数组
我想写一个函数,将n int作为数组的坐标,每个坐标的最大值。该函数将这些参数线性化,以达到特定的指标C++11 模板专门化中的std::数组,c++11,templates,C++11,Templates,我想写一个函数,将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_
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;
}
它说“std::array::iterator”不是一个类型。
如果我只是传递std::array,就会出现以下错误:“struct std::array”不是模板非类型参数的有效类型
有人知道如何解决这样的问题吗?我使用C++ 11 G++5.4.0./P>< P>首先,我想你在函数中有一点错误,因为如果你需要线性化数组的访问,你需要用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);
}
第一个函数是递归的基础,第二个函数使用两个参数包,但也使用两个显式模板参数来实现递归。使用@W.F。我看不出这对我有什么帮助。C++14很容易在C++11中编写。首先,我修改了我的帖子,确实是个错误。无论如何,这是聪明的!!!我真的以为我可以通过这样的包装,谢谢!我投降了,改用函子:非常感谢!
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);
}