2017-04-23 6 views
0

私はこれに新しいので、私は物事が不足している可能性があります。私は現在、次のコードを持っています:この再帰でベクトルを実装する方法は?

#include <iostream> 

template<int ...> struct mySum; 
template<>struct 
mySum<> { 
    static const int value = 0; 
}; 
template<int i, int ... tail> struct 
mySum<i, tail...> { 
    static const int value = i + mySum<tail...>::value; 
}; 
int sum = mySum<1, 2, 3, 4, 5, 6, 7, 8>::value; 

int main() { 
    std::cout << sum << std::endl; 

    return 0; 
} 

ご覧のとおり、再帰を使用して値の合計を整数として取得しています。このコードを変更してベクターを受け入れ、ベクターを返すにはどうすればよいですか?

は例えば、私は...

を2,4,6,8などを返す2.

1,2,3,4により全体のベクトルを乗算する場合、またはそこより良い方法です再帰的にこれを行うには?

編集:テンプレートは必須ではありません。再帰のみ。私はちょうどそれがテンプレートでこれを行う可能性があると思った...

+0

テンプレートパラメータとしてベクトルを使用することはできません。 – user463035818

+0

私は参照してください。だから私は他の方法を使わなければなりませんか? – sdkk2

+0

なぜコンパイル時にベクトルに2を掛けたいのですか?再帰的にする必要があるのはなぜですか? – user463035818

答えて

-2

再帰的にしたい場合は、関数int sum(...);(< stdarg.h>を含む)を使用する必要があります。

テンプレートは、書き換えを避けるための単なる方法です。すべてのテンプレートはコンパイル時に置き換えられます。コンパイル後、テンプレートはもう存在しません。

テンプレートはコンパイル時に決定されるため、コンパイル時に知られている式(定数式)のみが使用できます。 定義によるベクトルは定数ではないため、テンプレートでは使用できません。

+0

いいえ、 "怠け者"というのは、コンパイル時にテンプレートがもう存在しないということだけです。コンパイラはテンプレート関数を通常の型と同等のものに置き換えます。したがって、テンプレートで使用する各型/引数のオーバーロード関数を宣言して定義することは、厳密には同じです。 –

+0

あなたは本当にテンプレートが怠惰なプログラマーのためだと思いますか? – granmirupa

+0

私はテンプレートを使用できません。その情報をありがとう。より標準的な方法を使用しようとします。 – sdkk2

関連する問題