2017-07-05 6 views
3

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>ですが。

+0

コードには何が問題なのですか?それはちょうど図書館の見出しの中でちょっと酔っぱらってしまいます。だからちょっと畳んでいる人は気にします。どうやってこれをどうやってやることができるかといういくつかのアイデアがありますが、あなたの現在のアプローチの問題点が分からずに、何が最善であるかを理解するのは難しいです。 – Frank

+0

私のコードに問題はありません。私は何をしたいのかの説明として投稿しました。私はハナがこのためのアルゴリズムを持っているかどうかを知りたいだけです。 – SU3

答えて

2

私はこのような何かを推測したい:

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]); }); 
}; 

range_c自体はMonadPlusのではないので、インデックスを取得しているだけで厄介な部分を。この関数を使用した実際の例は次のとおりです。

constexpr auto types = make_tuple(
    type_c<std::string>, type_c<int>, type_c<double>, type_c<char>); 
constexpr auto ints = get_indices_of(types, trait<std::is_integral>); 
+2

お互いに答える猫と犬は、プログラミングの質問をメタプログラミング - 大ヒステリー!ところで、この機能のオープンリクエストもありますhttps://github.com/boostorg/hana/issues/273 –

+1

技術的には、 '〜(range_c <...>)'が必要なのは 'range_c'が' MonadPlus'([this](http://boostorg.github.io/hana/group__group-MonadPlus.html)参照)、それは 'Sequence'ではないからではありません。これはちょうどニックピックで、あなたの答えはそうでなければ正しいです。 –

+0

@LouisDionneハナの古いプルを使用しているに違いない、私は静的なアサートがシーケンスでなければならないと言ったことを誓う - 間違いなくMonadPlusと言います。 Woops。 – Barry

関連する問題