C++可变模板:删除/替换索引处的类型
C++ variadic template: remove/replace type at index
有没有办法:
1) 删除索引处的项目:
// Removes item at index N, e.g. Remove<2, a, b, c, d> results in <a, b, d>
template<std::size_t N, typename ...Args>
struct Remove {
// ???
};
2) 替换索引处的项目:
// Replaces item at index N with T, e.g. Replace<2, x, a, b, c, d> results in <a, b, x, d>
template<std::size_t N, typename T, typename ...Args>
struct Replace {
// ???
};
3) 替换范围内的项目
// Replaces items in range [N1, N2] with T, e.g. ReplaceRange<2, 3, x, a, b, c, d> results in <a, b, x>
template<std::size_t N1, std::size_t N2, typename T, 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, And, is_true>
,我想删除实参(is_true
),并用Filter:FilterAnd<is_true, is_true>
替换运算符(And
),其中实参与从列表中删除的实参相同。因此,我需要替换/删除模板来执行此操作。
提前谢谢。
这在带有std::index_sequence
的C++14中要容易得多,所以我已经使用了它。你可以在网上找到很多这样的实现。
我使用std::tuple
来整理周围的所有内容。
对于Replace
,我使用std::conditional
为每个类型索引选择T
或正确的元组元素。
对于Remove
,我取tuple_cat
的decltype
,它要么是空元组,要么是包含非移除类型索引的正确元组元素的元组。
namespace detail{
template<std::size_t N, typename T, 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, typename Tuple, 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 T, typename... Args>
using Replace = decltype(detail::replace<N,T,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...>{}));
CCD_ 15留给读者练习。
实时演示
相关文章:
- 模板参数替换失败,并且未完成隐式转换
- 数组索引的值没有增加
- 芬威克树(BIT).找到具有给定累积频率的最小索引,单位为 O(logN)
- 如何用转义符替换字符串中的所有特殊字符
- 查找最接近的大于当前数字的数字的索引
- 在C++中调整向量中的索引
- 重载元组索引运算符-C++
- 给定一个向量,如何找到该向量的所有子集和的原始索引
- 为std::string的某个索引赋值
- 并行用于C++17中数组索引范围内的循环
- 为什么除非添加括号,否则构造函数上的模板替换会失败?
- 将循环(以及其中的条件)替换为按索引直接访问
- C++ - 通过提升进行反向替换 - 错误的索引错误
- 如何替换字符串中特定索引处的一个字符
- 用指针替换循环索引器有什么好处吗?
- C++:用单个函数调用替换多个索引相等性测试
- 与排序相关的算法(将每个项目替换为排序排序中的索引)
- C++可变模板:删除/替换索引处的类型
- C++,std::transform-用索引替换项
- 用std::set替换std::map并按索引搜索