gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 04:45:43 30 4
gpt4 key购买 nike

是否可以在不访问 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/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com