2016-01-07 12 views
5

Anlatılmayan 2 parçam var. Bir kümenin diğerinin alt kümesi olup olmadığını kontrol etmek için deyimsel bir yol var mı?Tuple türlerinin birbirinin alt kümeleri olup olmadığını kontrol edin

Bu, hana::tuple_c yerine başka bir tür gerektirirse, bu da iyi olur. Aslında, şu anki girişim std::tuple'dan oluşuyor, ancak her iki şekilde çalışamıyorum. (Ama olası benzer bir şey olması gerektiğini hissediyorum) DEĞİL çalışır

Kodu:

#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), 
    "" 
); 

Benim şu anki geçici çözüm Bir kavşak yapmak boost::mpl kullanır ve sonra sonuçları karşılaştırın. Bu çalışır, ancak ben saf boost::hana solüsyon ilgileniyorum: Doğru boost::hana kullanmıyorsanız

#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, ""); 

cevap

9

. Bu çalışacaktır:

#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), ""); 

Açıklama:

hana::tuple_t<xs...>hana::type_c nesnelerin demet için kısa gösterimdir.

  • 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 nesneler değerlere türlerini sarın.

hana::is_subset(a, b) çekler a eğer b bir alt kümesidir ve viceversa (b sorunuzu a bir alt kümesi olup olmadığımı kontrol edildi) değil.

İlgili konular