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

标签 c++ sfinae boost-hana

是否可以在不访问 boost::hana::map<...> 的情况下检查键是否存在甚至值类型?对象,而是只有它的类型? (执行 SFINAE。)

这是一个代码,它创建了一个键 -> 集合的映射,并且想要检查集合是否包含一个元素,而不需要访问该映射的实例: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 数据结构的函数都会工作吗?对象?

最佳答案

要将类型用作实例而不实际实例化它,您可以使用 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

关于c++ - 如何在执行 SFINAE 时反省 boost::hana::map<...>,而没有它的 (constexpr) 实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57118046/

相关文章:

c++ - boost 哈纳 : create a map from a set and a default value

c++ - 关于套接字编程和多线程的面试问题

c++ - 检查蓝牙套接字中缓冲区的状态

c++ - 使用 std::result_of 的意外 SFINAE 失败

c++ - 断言代码不编译

c++ - Boost Hana 实现自定义序列

c++ - 给定 boost::hana 中的键元组,如何从映射中获取值元组?

c++ - Eigen 中的扩展/填充矩阵

c++ - 在 Linux 下区分共享驱动器上的文件和文件夹

c++ - 防止为字符串流提取运算符 (>>) 不支持的类型实例化模板类