使用Boost Hana过滤constexpr元组时遇编译错误的问询
Boost Hana filter编译错误解决方法
错误原因
你遇到的'elem' is not a constant expression错误,本质是boost::hana::bool_c要求模板参数必须是编译期常量表达式,但lambda中的elem是函数形参——哪怕lambda被标记为constexpr,形参本身也不属于编译期常量,无法用来实例化bool_c。
解决方案
根据使用场景,有两种可行的修正方式:
方式1:保留普通int元素,使用Hana内置谓词
直接用Hana提供的编译期比较工具替代手动实例化bool_c,无需修改tuple元素类型:
#include <boost/hana.hpp> namespace hana = boost::hana; int main() { constexpr auto a = hana::make_tuple(-1, 4, 5, -4); // 用hana::greater构造"大于0"的谓词 constexpr auto b = hana::filter(a, [](auto elem) constexpr { return hana::greater(elem, hana::int_c<0>); }); // 更简洁的方式:直接使用hana::is_positive(仅适用于整数类型) constexpr auto c = hana::filter(a, hana::is_positive); }
Hana的算术/判断工具会自动处理编译期常量的比较逻辑,不需要手动构造bool_c。
方式2:使用Hana编译期常量类型
如果需要直接基于编译期常量值操作,可以把tuple元素替换为hana::integral_constant(比如hana::int_c),此时元素本身就是编译期常量,可直接用于bool_c实例化:
#include <boost/hana.hpp> namespace hana = boost::hana; int main() { constexpr auto a = hana::make_tuple(hana::int_c<-1>, hana::int_c<4>, hana::int_c<5>, hana::int_c<-4>); constexpr auto b = hana::filter(a, [](auto elem) constexpr { return hana::bool_c<(elem.value > 0)>; }); }
这里elem是hana::integral_constant类型,其value成员是编译期常量,满足bool_c的模板参数要求。
补充说明
Boost Hana的核心是编译期元编程,大部分工具依赖编译期可求值的表达式。普通int作为tuple元素时,即便整个tuple是constexpr,元素作为函数参数传递时也无法被当作编译期常量处理,必须借助Hana提供的元编程工具来适配。
内容的提问来源于stack exchange,提问作者Nibor
相关产品推荐
相关产品推荐

