加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读