2016-01-07 17 views
5

Angenommen, ich habe 2 Tupel, die nicht instanziiert werden. Gibt es einen idiomatischen Weg, um zu überprüfen, ob eine Menge die Untermenge der anderen Menge ist?Überprüfen, ob Tupeltypen Teilmengen voneinander sind

Wenn dies einen anderen Typ als hana::tuple_c erfordert, ist das auch in Ordnung. Eigentlich besteht meine aktuelle Eingabe aus std::tuple, aber ich konnte es nicht in beide Richtungen arbeiten.

Code, der tut NICHT Arbeit (aber ich fühle mich wie sollte es etwas ähnliches möglich sein):

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

Meine aktuelle Problemumgehung verwendet boost::mpl eine Kreuzung zu tun und dann die Ergebnisse vergleichen. Dies funktioniert, aber ich habe Interesse an einer reinen boost::hana Lösung:

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

Antwort

9

Sie sind nicht boost::hana funktioniert nicht richtig. Dies funktioniert:

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

Erläuterung:

hana::tuple_t<xs...> ist Kurzschreibweise für ein Tupel von hana::type_c Objekten.

  • 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 Objekttypen in Werte wickeln.

hana::is_subset(a, b) prüft wenn a ist eine Teilmenge von b, und nicht umgekehrt (Sie wurden überprüft, ob b eine Teilmenge von a in Ihrer Frage war).