私はboost :: hanaに慣れようとしています。練習として、ユーザーが提供する比較関数を使ってhana :: tupleから重複を削除する関数を作成したいと思います。私が直面している問題は、タイプをオブジェクトとして格納するためにhana::type_c
を使用することに関連しています。ここでは、私がhana::type<pair<X,Y>>
から抽出するいかなる2番目の要素は存在しないとして最後の行が問題を作成boostahを使用してタイプリストから重複を削除する一貫した方法
#include <boost/hana/equal.hpp>
#include <boost/hana/tuple.hpp>
#include <boost/hana/unpack.hpp>
#include <boost/hana/pair.hpp>
#include <boost/hana/any_of.hpp>
#include <boost/hana/second.hpp>
#include <boost/hana/fold.hpp>
#include <boost/hana/core/make.hpp>
#include <boost/hana/core/tag_of.hpp>
#include <iostream>
template <class>
struct what_is;
namespace hana = boost::hana;
// simply push back an element to the sequence
auto push_back = [](auto seq, auto t) {
using namespace boost::hana;
return unpack(seq, [&](auto&&... element){return make<typename tag_of<decltype(seq)>::type>(element..., t);});
};
// this is the main function
auto remove_duplicates = [](auto seq, auto comp) {
using namespace boost::hana;
auto f = [&](auto state, auto el){
return if_(any_of(state, partial(comp, el)),
[=](){return state;},
[=](){return push_back(state, el);})();
};
return fold(seq, make<typename tag_of<decltype(seq)>::type>(), f);
};
// user-defined comparison function
// elements are considered equal if only second element of pairs are equal
auto comp_pair = [](auto&& t1, auto&& t2) {
using namespace boost::hana;
return equal(second(t1), second(t2));
};
int main() {
auto my_tuple1 = hana::tuple_t<int, float, double, int, float>;
auto no_dups1 = remove_duplicates(my_tuple1, hana::equal); // this is fine, decltype(no_dups1) -> tuple< type<int>, type<float>, type<double> >
auto my_tuple2 = hana::tuple_t< hana::pair<int, int>, hana::pair<float, int>, hana::pair<float, float> >;
// auto no_dups2 = remove_duplicates(my_tuple2, comp_pair); // what I want here is tuple< type<pair<int, int>>, type<pair<float, float>> >
}
を持っているものです。これがうまくいくには、tuple< pair<type<int>, type<int>>, pair<type<double>, type<int>>, pair<type<float>, type<double>> >
のような非常に醜いシーケンスを作成する必要があります。あなたはこれが本当に素早く悪くなることが想像できるように、たとえばシーケンスtuple<int, pair<X,Y>, double, float>
などを持っていれば、私はこれに対処するための統一的な方法を作ることができますか?私はMPL /融合のバックグラウンドから来て、そこでタイプをラップする必要なしに直接タイプに取り組むことができます。ありがとう
ありがとう、これでした。統一的には、 'remove_duplicates'関数が、タプルのすべての要素が' type 'でラップされていると仮定することを望んでいました。これは 'my_tuple1'ではうまくいきましたが、 'tuple 、type >と全く違う方法でラップしなければならない' my_tuple2'ではうまくいきませんでした。( '' type'は 'ペア)。 'comp_pair'関数を作成したのと同じように、私はこれを一般的なやり方の一般的な考え方にしています。ところでこのライブラリをありがとう!すごいもの –
linuxfever