【发布时间】:2018-06-13 13:34:31
【问题描述】:
我必须检查给定的两个元组是否是另一个元组的子集。我找到了这个优雅的解决方案Check if one set of types is a subset of the other。
但是这个解决方案的问题是它没有考虑子类型,例如
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 进行比较失败。所以需要改变的是 contains 函数来搜索子类型。
P.S 此代码仅适用于 C++17
【问题讨论】: