2016-07-08 22 views
5

私はこのようなことで未経験ですが、n -variable関数を "rotate"引数(以下の例を参照)で評価するテンプレート関数を作成しようとしていますこれらすべての値の関数FN = 3については、例えばC++可変テンプレート引数の反復

(X、Y、Z)が返さ三重\ベクターは(X、0,0)F

< なければなりません、 F(0、X、0)、F私は、次のようになります。必要なものの(0,0、X)>

ナイーブバージョン(necesありませんセーリー正しい\働き)

typedef FunctionSignature Function; 

template<class Function, size_t Dimensions> 
std::array<Function::Out,Dimensions> F(Function::InComponent x) 
{ 
    std::array<Function::Out,Dimensions> Result; 

    for (i=0; i<Dimensions; i++)  
    Result[i] = Function::f("rotate((x,0,...,0),i)"); 

    return Result; 
} 

しかし、rotateものを作る方法。

コンパイル時にnがよく知られているので、ランタイムforが何らかの形で削除されることも期待します。

+0

'f()'関数の代わりにパラメータとして明示的な値のリストを指定する代わりに、 'f()'関数が値のベクトルをとるようにしてください。ベクトルとして値を渡して、パラメータとして渡すと、簡単になります。多様な機能を扱う必要はありません。 –

+0

1) 'f'ベクトルを評価するのに問題はありません。 'n' = 1のときは重複する可能性があります。 .... 2)「やっかいになる」とは助けにならない... 特に、コンパイル時にどのように役立つのか分かりません。 –

答えて

5
template<class Function, size_t... Is, size_t... Js> 
typename Function::Out call_f(typename Function::InComponent x, 
           std::index_sequence<Is...>, 
           std::index_sequence<Js...>) { 
    return Function::f((void(Is), 0)..., x, (void(Js), 0)...); 
} 

template<class Function, size_t Dimensions, size_t... Is> 
std::array<typename Function::Out, Dimensions> F(typename Function::InComponent x, 
               std::index_sequence<Is...>) 
{ 
    return {{ call_f<Function>(x, std::make_index_sequence<Is>(), 
           std::make_index_sequence<Dimensions - Is - 1>())... }}; 
} 

template<class Function, size_t Dimensions> 
std::array<typename Function::Out,Dimensions> F(typename Function::InComponent x) 
{ 
    return F<Function, Dimensions>(x, std::make_index_sequence<Dimensions>()); 
} 

C++ 11の場合、SOを検索して実装をmake_index_sequenceにします。

Demo

+0

ありがとう、これは非常にいいと私は必要なものを正確に見えます! (私が自分で必要なものを知っていることを大きな希望で笑って) –

+0

'(void(Is)、0)...'は '(void(Is)、Function :: InComponent(0))にする必要があります。 ..完全に一般的な場合 –

関連する問題