C variadic模板:在索引处删除/替换类型
发布时间:2020-12-16 10:01:04 所属栏目:百科 来源:网络整理
导读:有办法: 1)删除索引处的项目: // Removes item at index N,e.g. Remove2,a,b,c,d results in a,dtemplatestd::size_t N,typename ...Argsstruct Remove { // ???}; 2)替换索引处的项目: // Replaces item at index N with T,e.g. Replace2,x,typename T,t
有办法:
1)删除索引处的项目: // Removes item at index N,e.g. Remove<2,a,b,c,d> results in <a,d> template<std::size_t N,typename ...Args> struct Remove { // ??? }; 2)替换索引处的项目: // Replaces item at index N with T,e.g. Replace<2,x,typename T,typename ...Args> struct Replace { // ??? }; 3)更换范围内的物品 // Replaces items in range [N1,N2] with T,e.g. ReplaceRange<2,3,x> template<std::size_t N1,std::size_t N2,typename ...Args> struct ReplaceRange { // ??? }; 我想让它像这样使用 class is_true { public: bool operator()() const { return true; } }; class is_false { public: bool operator()() const { return false; } }; class And { }; class Or { }; Filter f<is_true,And,is_true,Or,is_false>(); 现在,我想将其折叠为: < FilterOr < FilterAnd <is_true,is_true>,is_false > > 哪里 template<typename Lhs,typename Rhs> class FilterAnd { public: bool operator()() const { return Lhs() && Rhs(); } }; template<typename Lhs,typename Rhs> class FilterOr { public: bool operator()() const { return Lhs() || Rhs(); } }; 所以,我正在尝试执行以下操作: class Filter { public: template <typename ...Args> void apply() { holder_ = FilterHolder<typename FoldOperator<Or,FilterOr,typename FoldOperator<And,FilterAnd,Args...>::type >::type >(); } } FoldOperator基本上删除了运算符参数,并用Filter类替换运算符,例如对于参数< is_true,我想删除参数(is_true)并用Filter替换运算符(And):FilterAnd< is_true,is_true>其中参数与从列表中删除的参数相同.所以,我需要替换/删除模板来执行它. 提前致谢. 解决方法
这在使用std :: index_sequence的C 14中更容易,所以我使用了它.你可以在网上找到很多实现.
我使用std :: tuple来编组周围的一切. 对于Replace,我使用std :: conditional为每个类型索引选择T或正确的元组元素. 对于Remove,我将tuple_catting的decltype作为一个空元组或包含正确元组元素的元组用于非删除类型索引. namespace detail{ template<std::size_t N,typename Tuple,std::size_t... Idx> auto replace (std::index_sequence<Idx...>) -> std::tuple<std::conditional_t<N == Idx,T,std::tuple_element_t<N,Tuple>>...>; template<std::size_t N,std::size_t... Idx> auto remove (std::index_sequence<Idx...>) -> decltype(std::tuple_cat( std::declval< std::conditional_t<(N == Idx),std::tuple<>,std::tuple<std::tuple_element_t<Idx,Tuple>> > >()... )); } template <std::size_t N,typename... Args> using Replace = decltype(detail::replace<N,std::tuple<Args...>> (std::index_sequence_for<Args...>{})); template <std::size_t N,typename... Args> using Remove = decltype(detail::remove<N,std::tuple<Args...>> (std::index_sequence_for<Args...>{})); ReplaceRange留给读者练习. Live Demo (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |