2

テンプレートとして定義されたフィボナッチ数などのシーケンスがあると仮定しましょう。

template <unsigned int N> struct Fibonacci { unsigned int value = /*...*/; };

必要なのは、このシーケンスの最初の N 要素を含む constexpr 配列を取得することです。可変個引数テンプレートを使用して、それを行うことができます:

template <unsigned int ... Numbers>
struct FibArray
{
    static constexpr array<unsigned int, sizeof...(Numbers)> value = { Fibonacci<Numbers>::value... };
};
// and then:
const auto fib_array = FibArray<1, 2, 3, 4, 5, 6, 7>::value;

インデックスの手動列挙を回避し、必要な値の数だけで同じ配列を取得することは可能ですか? このようなもの:

const array<unsigned, 7> fib_array = GetFirstNFibValues<7>::value;
4

1 に答える 1

5

インデックスを生成することで、この動作を取得できます。

template<unsigned...> struct indices{};

template<unsigned N, unsigned... Indices>
struct indices_gen : indices_gen<N-1, N-1, Indices...>{};

template<unsigned... Indices>
struct indices_gen<1, Indices...>{
  using type = indices<1, Indices...>;
};

#include <array>

template<unsigned N>
struct fibonacci{
  static constexpr unsigned value = N; // yes, lazyness on my part
};

template<class IPack>
struct first_n_fib_impl;

template<unsigned... Is>
struct first_n_fib_impl<indices<Is...>>
{
  using arr_type = std::array<unsigned, sizeof...(Is)>;
  static constexpr arr_type value = {{ fibonacci<Is>::value... }};
};

template<unsigned... Is>
constexpr std::array<unsigned, sizeof...(Is)> first_n_fib_impl<indices<Is...>>::value;

template<unsigned N>
struct first_n_fib
  : first_n_fib_impl<typename indices_gen<N>::type>
{
};

実際の例 ([1..7]実際に生成されたことを示すため)。

于 2012-10-03T11:32:07.743 に答える