Проверьте, являются ли типы кортежей подмножествами друг друга

Скажем, у меня есть 2 кортежа, которые не были созданы. Есть ли идиоматический способ проверить, является ли один набор подмножеством другого?

Если для этого требуется другой тип вместо hana::tuple_c, это тоже хорошо. На самом деле, мой текущий вклад состоит из std::tuple, но я не мог заставить это работать так или иначе.

Код, который делает НЕ работать (но я чувствую, что должно быть что-то подобное возможно):

#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::mpl сделать пересечение, а затем сравнить результаты. Это работает, но я заинтересован в чистом 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, "");

5

Решение

Вы не используете boost::hana правильно. Это будет работать:

#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 в твоем вопросе).

9

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector