0

Inspiré par ce post https://stackoverflow.com/a/6730362 J'essaie de créer une séquence de compilation de types (intégrales) similaires qui peuvent être stockés dans la mémoire ROM uniquement en utilisant la métaprogrammation de modèle. L'idée est de définir un tableau en ajoutant progressivement des éléments ligne par ligne en utilisant le schéma variadique du modèle metaprogrammingcréer des tableaux de façon incrémentielle au moment de la compilation

Actuellement, je suis ici:

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...> {}; 

Je suis assez nouveau modèle métaprogrammation. Je n'ai donc aucune idée de ce que je fais ici. Mais le compilateur VS se plaint de quelques problèmes de spécialisation partielle:

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

Pouvez-vous m'aider ici? Pourquoi n'est-il pas déductible? J'ai écrit '-1'! L'idée ovedrall est d'avoir une variable d'index décrémentée pendant chaque appel jusqu'à ce que -1 soit atteint, ce qui fait que IncSeq hérite de Seq en utilisant les types fournis. Utilisation comme ceci:

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; 

Je sais que cela ressemble à beaucoup de hazzle, mais l'idée d'avoir un tableau dans la mémoire ROM en cours de construction ligne par ligne dans le code source peut présenter certains avantages pour certains d'entre nous.

Répondre

0

Pouvez-vous m'aider? Pourquoi n'est-il pas déductible? J'ai écrit '-1'!

Le compilateur ne peut pas en déduire idx exactement parce que vous avez écrit -1. Puisque vous spécifiez explicitement ce que idx devrait être, vous devriez vous débarrasser de celui-ci à partir des paramètres du modèle:

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

Vous devez également développer values ici:

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

Votre code va maintenant compiler. (je n'ai pas testé l'exactitude de votre solution.)

live wandbox example

+0

testés. Travaux. Merci. – rava