升级Boost至1.86编译旧Luabind代码时遇boost::mpl::eval_if编译错误
解决Boost 1.86编译老Luabind代码时
eval_if的type成员报错问题 问题本质
Boost.MPL的eval_if和旧版apply_if逻辑完全不同:
- 旧
apply_if直接返回元函数执行后的最终类型,所以可以直接用::type获取结果 - 新版
eval_if返回的是元函数本身,必须再套一层::type才能拿到实际类型,或者调整传入参数的形式
你碰到的'type': is not a member of boost::mpl::eval_if错误,就是因为在extract_parameter::iterator的类型定义里,直接把eval_if的返回值当成了带::type的类型,但实际上eval_if自身并没有这个成员——它的分支返回的元函数才会携带::type。
具体修复方法
假设你原有代码类似这样:
typedef typename boost::mpl::eval_if< some_condition, some_meta_func, another_meta_func >::type iterator;
提供两种可行的修改方式:
方式1:给分支元函数添加::type
如果分支是直接返回类型的元函数(比如boost::mpl::identity这类),直接在分支后加::type,让eval_if拿到的是具体类型:
typedef typename boost::mpl::eval_if< some_condition, typename some_meta_func::type, typename another_meta_func::type >::type iterator;
方式2:用apply_wrap适配旧逻辑
如果原apply_if是要触发元函数的计算逻辑,用boost::mpl::apply_wrap把元函数的调用逻辑包裹起来,让eval_if返回正确的类型:
typedef typename boost::mpl::eval_if< some_condition, boost::mpl::apply_wrap<some_meta_func>, boost::mpl::apply_wrap<another_meta_func> >::type iterator;
针对Luabind的适配调整
Luabind中extract_parameter相关代码,原本用apply_if是直接触发元函数计算结果,换成eval_if后,要确保每个分支都是带::type成员的类型。比如原代码如果是:
boost::mpl::apply_if<cond, iterator_type<X>, iterator_type<Y>>::type
改成eval_if后要写成:
typename boost::mpl::eval_if< cond, boost::mpl::identity<iterator_type<X>>, boost::mpl::identity<iterator_type<Y>> >::type
或者直接将iterator_type<X>作为分支,确保每个分支本身是能通过::type获取结果的类型。
验证注意事项
- 检查所有
eval_if的分支参数:必须是带::type成员的元函数对象,不能是元函数模板 - 如果分支是需要计算的逻辑,先用
apply或apply_wrap触发计算,再传入eval_if
内容的提问来源于stack exchange,提问作者BartekPL
相关产品推荐
相关产品推荐

