2016-01-07 5 views
5

2つのタプルがインスタンス化されていないとします。あるセットが他のセットのサブセットであるかどうかをチェックする慣用的な方法はありますか?タプルタイプが互いにサブセットであるかどうかを確認します。

hana::tuple_cの代わりに別のタイプが必要な場合は、これも問題ありません。実際には、私の現在の入力はstd::tupleですが、どちらの方法でも動作させることはできませんでした。私の現在の回避策が交差点を行い、その結果を比較することboost::mplを使用しています

#include <boost/hana.hpp> 
using namespace boost; 

using SetA = hana::tuple_c<int, char, float>; 
using SetB = hana::tuple_c<int, float>; 

static_assert(
    hana::is_subset(SetB, SetA), 
    "" 
); 

ませ仕事を(が可能似た何かがあるべきであるように私は感じる)し

コード。これは動作しますが、私は純粋なboost::hanaソリューションに興味がある:あなたが正しくboost::hanaを使用していない

#include <boost/mpl.hpp> 
using namespace boost; 

using SetA = mpl::set<int, char, float>; 
using SetB = mpl::set<int, float>; 

using Intersection = typename mpl::copy_if< 
    SetA, 
    mpl::has_key< SetB, mpl::_1 >, 
    mpl::back_inserter< mpl::vector<> > 
>::type; 

// since Intersection is a vector, subset also needs vector type 
using Subset = typename mpl::copy< 
    SetB, 
    mpl::back_inserter< mpl::vector<> > 
>::type; 

static_assert(std::is_same<Intersection, Subset>::value, ""); 

答えて

9

。これは動作します:

#include <boost/hana.hpp> 
using namespace boost; 

constexpr auto setA = hana::tuple_t<int, char, float>; 
constexpr auto setB = hana::tuple_t<int, float>; 

// Is `setB` a subset of `setA`? (Yes.) 
static_assert(hana::is_subset(setB, setA), ""); 

// Is `setA` a subset of `setB`? (No.) 
static_assert(!hana::is_subset(setA, setB), ""); 

説明:

hana::tuple_t<xs...>hana::type_cオブジェクトのタプルのための簡略表記です。

  • auto x = hana::tuple_t<int, char>; 
    // ...is equivalent to... 
    auto x = hana::make_tuple(hana::type_c<int>, hana::type_c<char>); 
    

hana::type_cオブジェクトの値に種類を包みます。

hana::is_subset(a, b)チェックa場合bのサブセットではなく、その逆bは、あなたの質問でaのサブセットだった場合、あなたがチェックした)です。

関連する問題