假设我有2个未实例化的元组.有没有惯用的方法来检查一组是否是另一组的子集?
如果这需要另一种类型而不是hana::tuple_c
,这也很好.实际上,我目前的输入包括std::tuple
,但我不能让它以任何方式工作.
代码,它不工作(但我觉得应该有类似的东西可能的):
#includeusing namespace boost; using SetA = hana::tuple_c ; using SetB = hana::tuple_c ; static_assert( hana::is_subset( SetB, SetA ), "" );
我当前的解决方法用于boost::mpl
做一个交集,然后比较结果.这有效,但我对一个纯粹的boost::hana
解决方案感兴趣:
#includeusing namespace boost; using SetA = mpl::set ; using SetB = mpl::set ; 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 ::value, "");
Vittorio Rom.. 10
你没有boost::hana
正确使用.这将有效:
#includeusing namespace boost; constexpr auto setA = hana::tuple_t ; constexpr auto setB = hana::tuple_t ; // 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
是hana::type_c
对象元组的简写符号.
auto x = hana::tuple_t; // ...is equivalent to... auto x = hana::make_tuple(hana::type_c , hana::type_c );
hana::type_c
对象将类型包装为值.
hana::is_subset(a, b)
检查if是否a
是一个子集b
,而不是反之(你在检查是否b
是a
你问题的一个子集).
你没有boost::hana
正确使用.这将有效:
#includeusing namespace boost; constexpr auto setA = hana::tuple_t ; constexpr auto setB = hana::tuple_t ; // 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
是hana::type_c
对象元组的简写符号.
auto x = hana::tuple_t; // ...is equivalent to... auto x = hana::make_tuple(hana::type_c , hana::type_c );
hana::type_c
对象将类型包装为值.
hana::is_subset(a, b)
检查if是否a
是一个子集b
,而不是反之(你在检查是否b
是a
你问题的一个子集).