mav*_*rik 3 c++ templates template-meta-programming variadic-templates c++11
有办法:
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 {
// ???
};
Run Code Online (Sandbox Code Playgroud)
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 {
// ???
};
Run Code Online (Sandbox Code Playgroud)
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 {
// ???
};
Run Code Online (Sandbox Code Playgroud)
我想让它像这样使用
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>();
Run Code Online (Sandbox Code Playgroud)
现在,我想将其折叠为:
< FilterOr < FilterAnd <is_true, is_true>, is_false > >
Run Code Online (Sandbox Code Playgroud)
哪里
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(); }
};
Run Code Online (Sandbox Code Playgroud)
所以,我正在尝试执行以下操作:
class Filter {
public:
template <typename ...Args>
void apply() {
holder_ = FilterHolder<typename FoldOperator<Or, FilterOr, typename FoldOperator<And, FilterAnd, Args...>::type >::type >();
}
}
Run Code Online (Sandbox Code Playgroud)
FoldOperator基本上删除运算符参数,并用Filterclass 替换运算符,例如对于参数<is_true, And, is_true>,我想删除arguments(is_true)并And用Filter 替换operator():FilterAnd<is_true, is_true>其中arguments与从列表中删除的参数相同.所以,我需要替换/删除模板来执行它.
提前致谢.
这在C++ 14中更容易std::index_sequence,所以我已经使用过了.你可以在网上找到很多实现.
我std::tuple用来整理周围的一切.
因为Replace,我曾经为每个类型索引std::conditional选择一个T或正确的元组元素.
为Remove,我走decltype的tuple_cat廷一个空元组或含有用于非去除型索引正确元组元素的元组.
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...>{}));
Run Code Online (Sandbox Code Playgroud)
ReplaceRange 留给读者的练习.
| 归档时间: |
|
| 查看次数: |
638 次 |
| 最近记录: |