You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Boost Metaparse中让解析器返回自定义ValNum类型

使用Boost Metaparse返回自定义ValNum类型的解析器实现

要让Boost Metaparse的解析器返回你定义的ValNum类型,核心是用transform适配器将基础解析器的结果转换为自定义类型。以下是具体实现步骤和代码示例:

完整可编译代码

#include <boost/metaparse.hpp>
#include <boost/mpl/int.hpp>
#include <boost/mpl/lambda.hpp>

namespace mp = boost::metaparse;
namespace mpl = boost::mpl;

// 你的自定义类型
template<int Value>
struct ValNum {
    constexpr static int value = Value;
};

// 元函数:将Boost MPL的整数类型转换为ValNum
template<typename Num>
struct to_valnum {
    using type = ValNum<Num::value>;
};

// 解析整数并返回ValNum的解析器
using valnum_parser = mp::transform<
    mp::int_,                  // 基础解析器:解析十进制整数,返回mpl::int_<N>
    mpl::lambda<to_valnum<mpl::_1>>::type  // 转换逻辑:把mpl整数转成ValNum
>;

// 针对单个数字的解析器(可选)
using single_digit_valnum_parser = mp::transform<
    mp::digit,                 // 基础解析器:解析单个0-9字符,返回mpl::char_<'c'>
    mpl::lambda<ValNum<mpl::_1::value - '0'>>::type  // 字符转数值后生成ValNum
>;

int main() {
    // 测试多位数解析
    using multi_result = mp::parse<valnum_parser, char const*>("123");
    static_assert(multi_result::type::value == 123, "多位数解析失败");

    // 测试单个数字解析
    using single_result = mp::parse<single_digit_valnum_parser, char const*>("5");
    static_assert(single_result::type::value == 5, "单个数字解析失败");

    return 0;
}

关键部分解释

  • 基础解析器选择:
    • mp::int_:用于解析完整的十进制整数(如"123"),返回boost::mpl::int_<N>类型(N为解析出的整数值)。
    • mp::digit:仅解析单个0-9字符,返回boost::mpl::char_<'c'>类型(c为字符值)。
  • transform适配器:
    Boost Metaparse的transform是核心适配器,它接收两个参数:原始解析器,以及一个元函数。元函数会接收原始解析器的结果,返回自定义类型作为最终解析结果。
  • 元函数转换逻辑:
    • 对于mp::int_的结果(mpl::int_<N>),直接用to_valnum元函数提取N作为ValNum的模板参数。
    • 对于mp::digit的结果(字符类型),需要通过mpl::_1::value - '0'将字符转换为对应的整数值,再传入ValNum。

验证解析结果

通过mp::parse执行解析后,结果的type成员就是最终的ValNum实例,你可以用static_assert在编译期验证结果的正确性,确保解析逻辑符合预期。

内容的提问来源于stack exchange,提问作者Tom

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 15:45:30