размышляю над такой задачкой... есть вот такой код (C++0x): Код (Text): #include <stdio.h> template <uint32_t ... Ints> struct Integers { static uint32_t Value[sizeof...(Ints)]; enum { Length = sizeof...(Ints) }; }; template <uint32_t ... Ints> uint32_t Integers<Ints ...>::Value[sizeof...(Ints)] = { Ints * 10 ... }; int main() { typedef Integers<10, 20, 30> Type; for(uint32_t t = 0; t < Type::Length; t++) { printf("%d\n", Type::Value[t]); } return 0; } то есть в зависимости от параметров шаблона числа (параметры шаблона) заталкиваются в массив умноженными на десять (на выходе: 100, 200, 300)... никак не могу понять, как сделать шаблон так, чтобы каждое число, помещаемое в массив зависело от значения предыдущего... например текущее число суммировалось бы с предыдущим, то есть для параметров шаблона <10, 20, 30> на выходе было бы 10, 30, 60... надо видимо как-то описать шаблон template <uint32_t Head, uint32_t ... Tail> uint32_t Integers<Head, Tail ...>::Value[sizeof...(Ints) + 1] = { ... }, но не приходит в голову, что поставить в фигурные скобки, чтобы это было понятно компилятору... есть какие-нить идеи? и еще можно ли как-нибудь внести зависимость от позиции элемента, например Ints * Idx * 10, где Idx - номер параметра?
Можно попробовать внутри класса объявить consexpr функцию, в которой объявить статический массив чисел, пока что без изменений. Функиця по переданному индексу будет вычислять реально требуемое значение массива. Теперь, чтобы сформировать итоговый массив надо вызвать имеющуюся функцию для каждого индекса массива. К сожалению код попробовать привести не могу -студия ещё неосилила constexpr и variadic templates
gcc 4.6.1 под линуксами и соответственно мингв с той же версией гцц под виндой... нужно все сделать на этапе компиляции... и к внутри constexpr нельзя объявлять никаких переменный, насколько я помню... нашел решение подобной задачи в интернете... тут реализовано "шифрование строк" на этапе компиляции и каждый символ зависит от предыдущего: http://www.raptorfactor.com/improved-compile-time-string-encryption/, но чет я не могу код понять)))
Вот кажется там и описан способ сделать список. Кажется это должно быть как-то так Код (Text): template<uint32_t last> struct EndList { struct EndMarker {}; enum { first = last; } typedef EndMarker Tail; }; tempplate<uint32_t first, uint32_t ..Ints> struct MakeList { enum { head = first; } typedef _IF<sizeof...(Ints)>1, MakeList<Ints...>, EndList<Ints...> > Tail; }; Проверить не могу, поэтому извиняюсь за возможный бред )
Вместе с развитием С++ нужно изобретать лекарство от смерти. Почему не придумать простой и понятный интерфейс для создания статических массивов?