是否可以在不访问boost::hana::map<...>
对象而仅具有其类型的情况下检查键是否存在甚至是值类型? (执行SFINAE。)
这是一个代码,该代码创建键-> set的映射,并且想要检查set是否包含元素,而无法访问该映射的实例:https://godbolt.org/z/zOluxI
#include <boost/hana.hpp>
#include <type_traits>
template<typename HanaMapType, typename = void>
struct double_key_has_2
: public std::false_type
{
};
template<typename HanaMapType>
struct double_key_has_2<HanaMapType,
std::enable_if_t<
std::is_same_v<HanaMapType, void> // (a placeholder to keep code compilable)
// detect a boost::hana::map<...>,
// that has a boost::hana::set<...> under hana::type_c<double> key,
// which contains boost::hana::hana::int_c<2>
>
>
: public std::true_type
{
};
int main() {
namespace hana = boost::hana;
auto my_map = hana::make_map(
hana::make_pair(hana::type_c<double>,
hana::make_set(
hana::int_c<0>,
hana::int_c<1>,
hana::int_c<2>
)
),
hana::make_pair(hana::type_c<int>,
hana::make_set(
hana::int_c<3>,
hana::int_c<4>,
hana::int_c<5>
)
)
);
static_assert(double_key_has_2<decltype(my_map)>::value); // this should pass
return 0;
}
或者换句话说,如果传递了std::declval<HanaDataStructType>()
对象,那么对hana数据结构进行操作的所有功能都可以正常工作吗?
答案 0 :(得分:1)
要将类型用作实例而不实际实例化它,可以使用std::declval<T>()
。
由于您要查找嵌套数据结构中的键,因此可以使用hana::find
来返回可以链接的hana::optional
Monad。
template <typename HanaMapType>
struct double_key_has_2<HanaMapType,
std::enable_if_t<decltype(hana::is_just(
hana::find(std::declval<HanaMapType>(), hana::type_c<double>)
| hana::reverse_partial(hana::find, hana::int_c<2>)))::value
>
>
: public std::true_type
{
};
根据您的示例:https://godbolt.org/z/Hv_7_q