Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++11 模板专门化中的std::数组_C++11_Templates - Fatal编程技术网

C++11 模板专门化中的std::数组

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_

我想写一个函数,将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;
}
它说“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);
}