#include #include #include #include #include #include template struct Sequence { }; template struct SequenceArray; template struct SequenceArray> { static const std::array arr; }; template struct Concat; template struct Concat, Sequence> { typedef Sequence type; }; template struct LeonardoNumber : std::integral_constant::value + LeonardoNumber::value + 1> { }; template<> struct LeonardoNumber<0> : std::integral_constant { }; template<> struct LeonardoNumber<1> : std::integral_constant { }; template const std::array SequenceArray>::arr = { { Vals... } }; template struct MaxLeonardoSequenceHelper; template struct MaxLeonardoSequenceHelper { static const size_t Next = LeonardoNumber::value; // If the last Leonardo Number's size exceeds MAX(size_t)/2, then we have // found the last LN in the sequence below MAX(size_t). Stop! static const bool Go = LeonardoNumber::value < (size_t() - 1)/2; typedef typename Concat, typename MaxLeonardoSequenceHelper::type>::type type; }; template struct MaxLeonardoSequenceHelper { typedef Sequence<> type; }; struct MaxLeonardoSequence { typedef Concat, MaxLeonardoSequenceHelper<>::type>::type type; }; int main() { using namespace std; typedef SequenceArray Leos; for (const auto &e : Leos::arr) { cout << e << endl; } }