постепенно создавать массивы во время компиляции

Вдохновленный этим постом
https://stackoverflow.com/a/6730362
Я пытаюсь настроить последовательность времени компиляции аналогичных (целочисленных) типов, которые могут храниться в ПЗУ только с помощью шаблонного метапрограммирования.
Идея состоит в том, чтобы определять массив постепенно, добавляя элементы построчно, используя вариационную схему метапрограммирования шаблонов.

В настоящее время я здесь:

template<typename T, T... values> struct Seq
{
static const T value[sizeof...(values)];
static const uint16 n;
};
template<typename T, T... values> const T       Seq<T, values...>::value[]  = { values };
template<typename T, T... values> const uint16  Seq<T, values...>::n        = sizeof...(values);

template<sint32 idx, typename T, T... values> struct IncSeq;
template<sint32 idx, typename T, T... values> struct IncSeq<-1, T, values...> : Seq<T, values...> {};

Я довольно новичок в шаблонном метапрограммировании. Поэтому я понятия не имею, что я здесь делаю. Но VS-компилятор жалуется на некоторые частичные проблемы специализации:

'idx' : template parameter not used or deducible in partial specialization 'IncSeq<-1,T,values...>'

Вы можете помочь мне здесь? Почему это не вычитается? Я написал «-1»!

идея ovedrall состоит в том, чтобы при каждом вызове уменьшать индексную переменную до достижения -1, что заставляет IncSeq наследоваться от Seq, используя предоставленные типы. Использование так:

template<sint32 idx, typename T, T... values> struct IncSeq<0, uint8, values...> : IncSeq<-1, uint8, 42, values..>{};
template<sint32 idx, typename T, T... values> struct IncSeq<1, uint8, values...> : IncSeq<0, uint8, 43, values..>{};
template<sint32 idx, typename T, T... values> struct IncSeq<2, uint8, values...> : IncSeq<1, uint8, 44, values..>{};
typedef IncSeq<2, uint8> myStaticArray;

Я понимаю, что это выглядит много неприятностей, но идея создания массива в ПЗУ, строящегося построчно в исходном коде, может дать некоторые преимущества некоторым из нас.

0

Решение

Вы можете помочь мне здесь? Почему это не вычитается? Я написал «-1»!

Компилятор не может вывести idx именно потому, что вы написали -1, Поскольку вы явно указываете, что idx должно быть, вы должны избавиться от него из параметров шаблона:

template<typename T, T... values> struct IncSeq<-1, T, values...> : Seq<T, values...> {};

Вам также необходимо расширить values Вот:

template<typename T, T... values>
const T Seq<T, values...>::value[] = { values... };

Ваш код теперь скомпилируется. (Я не проверял правильность вашего решения.)

пример живой wandbox

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector