在Hana中满足谓词的元组元素索引的顺序

时间:2017-07-05 20:05:51

标签: c++ tuples c++14 boost-hana

是否有简洁方法来获取满足Hana中谓词的元组元素索引序列?

以下是我使用标准库编写的代码:

template <template<typename> typename Pred, typename Tuple>
class get_indices_of {
  static constexpr size_t size = std::tuple_size<Tuple>::value;
  template <size_t I, size_t... II> struct impl {
    using type = std::conditional_t<
      Pred<std::tuple_element_t<I,Tuple>>::value,
      typename impl<I+1, II..., I>::type,
      typename impl<I+1, II...>::type >;
  };
  template <size_t... II> struct impl<size,II...> {
    using type = std::index_sequence<II...>;
  };
public:
  using type = typename impl<0>::type;
};
template <template<typename> typename Pred, typename Tuple>
using get_indices_of_t = typename get_indices_of<Pred,Tuple>::type;

用法示例:

using types = std::tuple<std::string,int,double,char>;
using ints = get_indices_of_t<std::is_integral,types>;

ints的类型现在为std::index_sequence<1ul, 3ul>

1 个答案:

答案 0 :(得分:2)

我猜是这样的:

const testSettings = "test Settings...";

module.exports = {
    test:testSettings
}

唯一令人尴尬的部分是获取索引,因为constexpr auto get_indices_of = [](auto tuple, auto predicate){ constexpr auto indices = to<tuple_tag>(range_c<std::size_t, 0, size(tuple)>); return filter(indices, [=](auto i){ return predicate(tuple[i]); }); }; 本身不是MonadPlus。您使用此函数的实际示例是:

range_c