在编译时以

时间:2017-03-27 14:41:31

标签: c++ arrays variadic-templates template-meta-programming

受此帖的启发 https://stackoverflow.com/a/6730362 我正在尝试建立一个类似(整数)类型的编译时序列,只能使用模板元编程存储在ROM中。 我们的想法是通过使用模板元编程的可变方案逐行添加元素来逐步定义数组

目前我在这里:

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;

我意识到这看起来像很多hazzle但是在源代码中逐行构建ROM中的数组的想法可能会给我们中的一些人带来一些好处。

1 个答案:

答案 0 :(得分:0)

  你可以帮帮我吗?为什么它不能被推导出来?我写了&#39; -1&#39;!

编译器无法完全推断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... };

您的代码现在将编译。 (我尚未测试您解决方案的正确性。)

live wandbox example