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

如何通过宏函数获取Boost PP序列的集合差集?

用Boost PP宏实现序列的集合差集运算

要实现两个Boost PP序列的差集(从序列A中移除所有在序列B中出现的元素),可以借助Boost PP的序列遍历、元素查找和条件分支宏完成,核心逻辑是遍历原序列,保留不在排除序列中的元素。以下是具体实现:

实现代码

#include <boost/preprocessor/seq/for_each.hpp>
#include <boost/preprocessor/seq/find.hpp>
#include <boost/preprocessor/if.hpp>
#include <boost/preprocessor/empty.hpp>

// 辅助宏:判断当前元素是否不在排除序列中,是则输出元素的序列形式
#define _KEEP_IF_NOT_IN_EXCLUDE(r, exclude_seq, elem) \
    BOOST_PP_IF( \
        BOOST_PP_EQUAL(BOOST_PP_SEQ_FIND(exclude_seq, elem), -1), \
        (elem), \
        BOOST_PP_EMPTY() \
    )

// 顶层调用宏:计算序列A与序列B的差集(A - B)
#define SEQ_DIFFERENCE(source_seq, exclude_seq) \
    BOOST_PP_SEQ_FOR_EACH(_KEEP_IF_NOT_IN_EXCLUDE, exclude_seq, source_seq)

// 示例使用
#define FRUIT (apple)(banana)(pear)(orange)
#define EAT (banana)(orange)
// 计算差集得到目标序列REST
#define REST SEQ_DIFFERENCE(FRUIT, EAT)

代码说明

  1. _KEEP_IF_NOT_IN_EXCLUDE:作为BOOST_PP_SEQ_FOR_EACH的回调宏,接收三个参数:

    • r:Boost PP内部使用的冗余参数
    • exclude_seq:要排除的序列(即示例中的EAT)
    • elem:当前遍历到的原序列元素
      通过BOOST_PP_SEQ_FIND检查元素是否在排除序列中,若返回-1(表示不存在),则输出(elem),否则输出空内容。
  2. SEQ_DIFFERENCE:对外的简洁调用接口,通过BOOST_PP_SEQ_FOR_EACH遍历原序列,将排除序列作为额外数据传递给回调宏,最终拼接所有保留的元素,形成差集序列。

验证结果

通过编译器预编译输出(如GCC的-E参数)可以看到,REST会被展开为:

(apple)(pear)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 21:32:13