2017-04-19 129 views
0

我想编写一个函数,将n int作为每个坐标的最大值的数组坐标。该函数将这些参数线性化以针对特定索引。std ::模板专门化中的数组

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

使用[non-type template parameters]的[pack](http://en.cppreference.com/w/cpp/language/parameter_pack)(http://stackoverflow.com/documentation/c%2b%2b/460/templates/16713/non-type-template-parameter#t = 201704191346386294095) –

+0

@WF我不明白它是如何帮助我的。 – Viridya

+0

C++ 14的[标准:: integer_sequence](http://en.cppreference.com/w/cpp/utility/integer_sequence)(在C++ 11容易写)。 –

回答

1

首先,我想你做你的功能有点失误,因为如果你需要线性阵列的访问,你需要通过XMAX

int my_func(int x, int y, int XMAX, int YMAX){ 
    return x + y*XMAX; 
} 

,因为每一行是由XMAX来multuplyÿ项目。为了回答你的问题我用了一个模板参数包

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

+0

首先,我修改了我的帖子,确实是一个错误。 无论如何,这是聪明!我确实认为我可以像这样传球,非常感谢!我投降了,用functor代替:)非常感谢! – Viridya