#include template struct Pack { }; template struct Contains; template struct Contains> { constexpr static bool value { (std::is_same_v || ...) }; }; template struct Is_Subset; template struct Is_Subset, T> { constexpr static bool value { (Contains::value && ...) }; }; template struct Are_Equal { constexpr static bool value { Is_Subset::value && Is_Subset::value }; }; int main() { using List = Pack; static_assert( Contains::value ); static_assert( !Contains::value ); static_assert( Is_Subset, List>::value ); static_assert( !Is_Subset, List>::value ); static_assert( Are_Equal::value ); static_assert( !Are_Equal, List>::value ); }