如何在执行SFINAE时内省boost :: hana :: map <...>,而没有它的(constexpr)实例?

时间:2019-07-19 18:39:37

标签: c++ sfinae boost-hana

是否可以在不访问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数据结构进行操作的所有功能都可以正常工作吗?

1 个答案:

答案 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