C++ 如何反思boost::hana::map<&燃气轮机;在执行SFINAE时,是否没有它的(constexpr)实例?
是否可以在不访问C++ 如何反思boost::hana::map<&燃气轮机;在执行SFINAE时,是否没有它的(constexpr)实例?,c++,sfinae,boost-hana,C++,Sfinae,Boost Hana,是否可以在不访问boost::hana::map对象的情况下检查键是否存在,甚至检查值类型,而只检查其类型?(执行SFINAE。) 下面是一段代码,它创建了一个key->set的映射,并希望检查set是否包含元素,而不需要访问该映射的实例: #包括 #包括 模板 结构双\u键\u有\u 2 :public std::false\u类型 { }; 模板 结构双\u键\u有\u 2 > :public std::true\u类型 { }; int main(){ 名称空间hana=boost::ha
boost::hana::map
对象的情况下检查键是否存在,甚至检查值类型,而只检查其类型?(执行SFINAE。)
下面是一段代码,它创建了一个key->set的映射,并希望检查set是否包含元素,而不需要访问该映射的实例:
#包括
#包括
模板
结构双\u键\u有\u 2
:public std::false\u类型
{
};
模板
结构双\u键\u有\u 2
>
:public std::true\u类型
{
};
int main(){
名称空间hana=boost::hana;
自动生成我的地图=hana::生成地图(
hana::make_pair(hana::type_c,
hana::生成集合(
hana::int_c,
hana::int_c,
hana::int_c
)
),
hana::make_pair(hana::type_c,
hana::生成集合(
hana::int_c,
hana::int_c,
hana::int_c
)
)
);
static_assert(双_键_有_2::value);//应该传递
返回0;
}
或者换句话说,如果传递了
std::declval()
objects,所有在hana数据结构上操作的函数都能工作吗?要将类型用作实例而不实际实例化它,可以使用std::declval()
因为您要在嵌套数据结构中查找键,所以可以使用它返回一个可以链接的Monad
模板
结构双\u键\u有\u 2
:public std::true\u类型
{
};
从你的例子来看:是的,如果我能使用
std::declval()
事情就变得可能了。对我来说,std::declval()
是否有效并不明显。这是否适用于所有hana功能?在C++ C++元编程库中,数据对象有反直观性,因为它们通常通过模板/类型系统本身来计算计算。“这将对所有HANA函数起作用吗?”是的,我认为所有C++函数都会使用它,因为您只对嵌入在返回类型中的数据感兴趣。顺便提一下,还有hana::declval(hana::type_c)
。
#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;
}