あるタイプのセットが他のタイプのサブセットであるかどうかを確認する 質問する

あるタイプのセットが他のタイプのサブセットであるかどうかを確認する 質問する

1 つのパラメータ パック (セットとして解釈) が別のパラメータ パックのサブセットであるかどうかをどのように確認できますか?

これまでのところ、フレーム (std::tuple を使用) のみがあり、機能はありません。

#include <tuple>
#include <type_traits>

template <typename, typename>
struct is_subset_of : std::false_type
{
};

template <typename ... Types1, typename ... Types2>
struct is_subset_of<std::tuple<Types1...>, std::tuple<Types2...>>
    : std::true_type
{
    // Should only be true_type if Types1 is a subset of Types2
};

int main() {
    using t1 = std::tuple<int, double>;
    using t2 = std::tuple<double, int>;
    using t3 = std::tuple<int, double, char>;

    static_assert(is_subset_of<t1, t1>::value, "err");
    static_assert(is_subset_of<t1, t2>::value, "err");
    static_assert(is_subset_of<t2, t1>::value, "err");
    static_assert(is_subset_of<t2, t3>::value, "err");
    static_assert(!is_subset_of<t3, t2>::value, "err");
}

どのタイプもセット内で複数回出現することはできません。

このソリューションが C++11 でも動作すれば良いのですが。

ベストアンサー1

#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...> && ...);

デモ

おすすめ記事