2017-04-19 18 views
0

各座標の最大値を持つ配列の座標としてn intをとる関数を作成したいと思います。この関数は、これらのパラメータを線形化して特定のインデックスをターゲットにします。std :: array in template specialization

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

ここでは2次元の例ですが、私はvariadicテンプレートのおかげでかなり簡単に何かを作ることができます。 しかし、私はパラメータの各座標の最大値を取らない同じ関数を作りたいと思っています。そのような 何か:

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

ここでは、2Dで動作しますが、私は1からNの寸法にそれを一般化したいと私はそれを達成できたのか分かりません。 は次元の数であり、実際の最大値を含むstd::arrayのイテレータであるstd::array<N, int>::iteratorを渡しますが、コンパイルされません。ここで コードです:

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

[非型テンプレートパラメータ]の[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の[std :: integer_sequence](http://en.cppreference.com/w/cpp/utility/integer_sequence)(簡単にC++ 11で書き込み可能) –

答えて

1

まず第一に、私はあなたが、配列のアクセスを線形化する必要がある場合は、各行がXMAXで構成されているので、XMAX

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

でYをmultuplyする必要があるので、あなたが、あなたの関数で小さなミスをしたと仮定しますアイテム。あなたの質問への答えのために私は、第二の機能は、再帰を可能にするために2つのパラメータパックも2明示的なテンプレートパラメータを使用

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); 
} 

拳関数は再帰のためのベースとなるテンプレートパラメータパックを使用しました。

+0

まず、投稿を修正しました。間違いでした。 とにかく、それはスマートです!私はそのようなパックを渡すことができると思った、ありがとう!私は、代わりに関数を使用して降伏した:) :)ありがとう! – Viridya