[英]incrementally create arrays at compile time
受这篇文章的启发, 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;
我意识到这看起来很麻烦,但是在源代码中逐行构造ROM中的数组的想法可能会给我们中的一些人带来一些好处。
你能帮我吗? 为什么它不可推论? 我写了“ -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... };
您的代码现在将编译。 (我尚未测试您解决方案的正确性。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.