在编译时使整数序列唯一
ihave:模板gt;类序列{};模板gt;struct uniq{using type=seqgt;};I需要以某种方式使序列唯一,以便std::与uniqgt;::type,seqgt;;最终为真。换句话说
解答动态
使用标准库中的std 使用<;type
traitslt;type\u traitslt;类,自动。。。Nslt;模板gt;T类,自动。。。Ms,自动N,自动。。。Nslt;Tgt;,N,Ns…lt;(。。。
(N==Ms)),uniq\u impllt;Ms…gt;,uniq\u impllt;Ms…,Ngt;{};templatelt;auto…gt;结构uniq\u impllt;Ms..lt;Ms..lt;int。。。Nslt;内部。。。Nslt;seqgt;static\u assert(std::is\u same\u vlt;1,2,2,3,3lt;1,2,3lt;>和参数包auto开始工作。。。Ns,然后使用template specialization
templatelt;auto…gt;结构统一实现lt;Ms…gt;:标准::条件的\U T<;(。。。(N==Ms)),uniq\u impllt;Ms…gt;,uniq\u impllt;Ms…,Ngt;{}; 检查N是否在自动。。。Ms使用折叠表达式并决定是将N压入Ms还是使用std::conditional\u t丢弃它。一旦自动。。。Ns为空,则使用specialization
templatelt;auto…gt;struct uniq\u impllt;Ms..lt;Ms..lt;增压/m 1/算法.hpp命名空间详细信息{templatelt;auto…gt;类uniq\u impl{static boost::m 1::mp\u listlt;decltype(Ns),Nsgt;types();模板gt;静态boost::m 1::mp\u uniquegt;转换(L);模板gt;静态Tgt;值(boost::m 1::mp_listlt;Ts,Msgt;);public:使用type=decltype(值(transform(types());};}//namespace detailtemplategt;类序列{};模板gt;使用uniq=detail::uniq\u implgt;static\u assert(std::is\u same\u vlt;1,2,2,3,3lt;1,2,3>;); 试试看godbolt.org网站:Demo.
您可以将boost::m 1::mp
u unique用于this.
示例:
#includegt;命名空间{templategt;使用seq=boost::m 1::mp_list_cgt;模板gt;Ngt;Ngt;Ngt;Ngt;Ngt;Ngt;Ngt;Ngt;Nlt;lt;lt;N。。gt;;;lt;int。。。Nlt;内部。。。Nlt;int。。。Islt;int,Is…gt;seqgt;;public:使用type=decltype(uniquer(boost::m 1::mp\u uniquelt;int,N…>;{}));};要删除相邻的重复项(至于std::unique),可以执行以下操作:
templatelt;gt;lt;typename Reslt;std::index\u sequencegt;,Reslt;std::size\u t I,std::size\u t。。。是,std::大小\u t。。。Jslt;std::index\u sequencegt;,std::index\u sequencegt;:reverselt;Is…lt;I,Js…lt;typename Seq,typename Res=std::index\u sequencegt;;struct uniq;templatelt;struct uniqlt;,Reslt;Reslt;std::size\u t I,std::size\u t。。。是,std::大小\u t。。。Jslt;std::index\u sequencegt;,std::index\u sequencegt;:uniqlt;Is…lt;I,Js…lt;std::size\u t I,std::size\u t。。。是,std::大小\u t。。。Jslt;std::index\u sequencegt;,std::index\u sequencegt;:uniqlt;Is…lt;I,Js…lt;reverselt;3,2,1lt;1,2,3lt;UNIQ&LT;STD::索引1,2,2,2,3,3,3和Gt; lt;1, 2, 3和gt;;C++ 20, DEMPO2 ,一些算法甚至成为COUNExPR和允许:
模板gt;consteval auto unique\u impl(std::index\u sequencegt;,std::index\u sequencegt;){constexpr std::arraygt;arr=[](){std::arraygt;arr{{Is…};std::unique(布置开始(), 布置端());return arr;}();return std::index_sequencegt;{};}模板gt;consteval auto unique\u impl(std::index\u sequencegt;seq){constexpr std::size\u t size=[](){std::arraygt;arr{{Is…};auto it=std::unique(布置开始(), 布置端());返回标准::距离(布置开始(),it);}();return unique_impl(seq,std::make_index_sequencegt;());}模板gt;using unique=decltype(unique\u impl(std::index\u sequencegt;{}));static\u assert(std::Is\u same\u vlt;1,2,2,3,3lt;1,2,3>;); demo
注意:constexpr std::vector通常甚至允许删除lambda.
中的重复代码- End
免责声明:
本页内容仅代表作者本人意见,若因此产生任何纠纷由作者本人负责,概与琴岛网公司无关。本页内容仅供参考,请您根据自身实际情况谨慎操作。尤其涉及您或第三方利益等事项,请咨询专业人士处理。