2016-09-12 2 views
1

型のリストをフィルタリングしようとしていますが、動作していないようです。私はここで何か間違ったことをやっていると確信している、ここで私はそれを再現するために作成したテストです:boost :: hanaを使用した型のリストのフィルタリング

#include <iostream> 

#include <boost/hana.hpp> 
#include <boost/hana/ext/std/tuple.hpp> 

struct X { 
}; 
struct Y { 
}; 
struct Z { 
}; 

int main(int argc, char **argv) { 

    namespace hana = boost::hana; 

    constexpr std::tuple<X, Y, Z> list; 
    constexpr std::tuple<X> filterlist; 

    auto t = hana::filter(list, [&](auto t) { 
      return hana::not_(hana::contains(filterlist, hana::decltype_(t))); 
     }); 

    std::cout << "filtered list contains " << hana::size(t) << " items, expected 2 items" << std::endl; 

    return 0; 
} 

基本的に私が欲しいもの: 私はタイプのリストを持っていると私はリストを返したいですフィルタリストに含まれていない項目。したがって、この場合はstd::tuple<Y, Z>である必要があります。

このプログラムの現在の出力は次のとおりです。 フィルタリングされたリストは、3つの項目が含まれている、問題はあなたがタイプ(decltype_(X{}) == type<X>{}が)であるかどうかをチェックしているということである2つの項目

よろしく、Matthijs

答えて

3

を期待フィルタリストは、型ではなく実際のオブジェクトを含みます。言い換えれば、実際のタイプのオブジェクトTとあるタイプTを表すstd::type_infoオブジェクトを比較しようとしているかのように少しです。それは意味的に意味がない。代わりに、何がしたいことは、次のとおりです。

#include <iostream> 
#include <boost/hana.hpp> 
#include <boost/hana/ext/std/tuple.hpp> 
namespace hana = boost::hana; 

struct X { }; 
struct Y { }; 
struct Z { }; 

int main(int argc, char **argv) { 
    constexpr std::tuple<X, Y, Z> list; 
    constexpr std::tuple<hana::type<X>> filterlist; 
    auto t = hana::remove_if(list, [&](auto t) { 
    return hana::contains(filterlist, hana::decltype_(t)); 
    }); 

    std::cout << "filtered list contains " << hana::size(t) << " items, expected 2 items" << std::endl; 
} 

言われていること、あなたはすでに他の目的のために、とにかく周りだfilterlistタプルを持っている場合、あなたはまだフィルタリングするためにそれを使用することができます:

#include <iostream> 
#include <boost/hana.hpp> 
#include <boost/hana/ext/std/tuple.hpp> 
namespace hana = boost::hana; 

struct X { }; 
struct Y { }; 
struct Z { }; 

int main(int argc, char **argv) { 
    constexpr std::tuple<X, Y, Z> list; 
    constexpr std::tuple<X> filterlist; 
    auto t = hana::remove_if(list, [&](auto t) { 
    return hana::any_of(filterlist, [&](auto u) { 
     return hana::decltype_(u) == hana::decltype_(t); 
    }); 
    }); 

    std::cout << "filtered list contains " << hana::size(t) << " items, expected 2 items" << std::endl; 
} 

として、彼らがO(n^2)コンパイル時であるので、これらの構文に注意する必要があります。効率的なルックアップが必要な場合は、hana::setを使用することを検討してください(今実装はうまくいっていますが、もっと時間があると改善されます)。

関連する問題