Я должен проверить, если дано два кортежа, один является подмножеством другого.Я нашел это элегантное решение Проверьте, является ли один набор типов подмножеством другого .
Но проблема этого решения заключается в том, что оно не учитывает подтипы, например:
using t1 = std::tuple<int, double>;
using t2 = std::tuple<double, int>;
using t3 = std::tuple<t1, t2>;
Это может не пройти тест подмножества.
#include <tuple>
#include <type_traits>
template <typename T, typename... Ts>
constexpr bool contains = (std::is_same<T, Ts>{} || ...);
template <typename Subset, typename Set>
constexpr bool is_subset_of = false;
template <typename... Ts, typename... Us>
constexpr bool is_subset_of<std::tuple<Ts...>, std::tuple<Us...>>
= (contains<Ts, Us...> && ...);
Причина в том, что если мы сделаем подмножество в t1 и t3, выражение содержит сравнивает int с t1, что не удается.Таким образом, необходимо изменить функцию для поиска подтипов.
PS Этот код будет работать только на C ++ 17