繁体   English   中英

模板元编程,用于连接编译时序列

[英]Template Metaprogramming for concatenation of compile-time sequences

因此,我一直在尝试使用自己的序列类在c ++中使用编译时序列,但是我遇到了一个急切的模板实例化问题,或者至少我认为是这样。

template <typename SeqA, typename SeqB, int... Items>
class Concat 
    : public std::conditional<SeqA::is_empty() && SeqB::is_empty(),
                 Seq<Items...>, 
                 typename std::conditional<SeqA::is_empty(),
                     typename Concat<SeqA, typename SeqB::Tail, Items..., SeqB::Head>::type, 
                     typename Concat<typename SeqA::Tail, SeqB, Items..., SeqA::Head>::type
                 >::type
              >
{
};

我从编译器收到一条错误消息,指出

main.cpp: In instantiation of ‘Concat<Seq<2, 4, 6, 8, 10>, Seq<>, 1, 3, 5, 7, 9>’:
main.cpp:75:7:   recursively instantiated from ‘Concat<Seq<2, 4, 6, 8, 10>, Seq<3, 5, 7, 9>, 1>’
main.cpp:75:7:   instantiated from ‘Concat<Seq<2, 4, 6, 8, 10>, Seq<1, 3, 5, 7, 9> >’
main.cpp:99:52:   instantiated from here
main.cpp:75:7: error: no type named ‘Tail’ in ‘class Seq<>’
...

concat类的工作方式是从第一个非空序列中获取一个项目并将其附加到其自己的可变参数中。 当两个集合都为空时,它将返回一个以元素为序列的Set,但是错误消息使我感觉编译器将实例化std :: conditional的两个部分,而与真值无关。 有没有办法解决这个问题?

这太复杂了。 这就是我写Concat

template <int...> class Seq;
template <typename SeqA, typename SeqB> class Concat;
template <int... Ints1, int... Ints2>
class Concat<Seq<Ints1...>, Seq<Ints2...>>
{
    using type = Seq<Ints1..., Ints2...>;
};

是的, std::conditional需要评估其所有参数; 不会发生短路。 可以像在编程中一样,使用另一层间接寻址解决此问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM