2016-01-07 9 views
5

Powiedz, że mam 2 krotki, które nie są instancjami. Czy istnieje idiomatyczny sposób sprawdzenia, czy jeden zestaw jest podzbiorem drugiego?Sprawdź, czy typy krotek są podzbiorami względem siebie.

Jeśli to wymaga innego typu niż hana::tuple_c, również jest w porządku. W rzeczywistości mój bieżący wkład składa się z std::tuple, ale nie mogłem go uruchomić w żaden sposób.

Code że nie pracy (ale czuję się jak nie powinno być coś podobnego to możliwe):

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

Moje bieżące obejście wykorzystuje boost::mpl zrobić skrzyżowanie, a następnie porównać wyniki. To działa, ale jestem zainteresowany w czystej boost::hana rozwiązanie:

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

Odpowiedz

9

nie używasz boost::hana poprawnie. To będzie działać:

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

Objaśnienie:

hana::tuple_t<xs...> jest skróconym zapisem dla krotka hana::type_c obiektów.

  • 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 przedmioty do zawijania rodzaju wartości.

hana::is_subset(a, b) sprawdza jeśli a jest podzbiorem b, a nie na odwrót (trzeba było sprawdzenie czy b był podzbiorem a w swoim pytaniu).

Powiązane problemy