模板特化中的std :: array

时间:2017-04-19 13:40:20

标签: 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_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)。

1 个答案:

答案 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个显式模板参数,使递归成为可能。