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

能否借助Boost Preprocessor API将结构体所有成员传入函数?

利用Boost Preprocessor将结构体成员批量传入函数的修正方案

原代码核心问题

  1. 宏PASS_MEMBER_TO_FUNCTION会为每个结构体成员单独生成一次function()调用,而实际需求是单次调用传入所有成员参数,这导致编译时出现多次参数列表不匹配的函数调用错误。
  2. 错误使用BOOST_PP_VARIADIC_SEQ_TO_SEQ:传入的members已经是Boost预处理序列格式,无需额外转换。

修正后的代码

#include <iostream>
#include <boost/preprocessor/seq/transform.hpp>
#include <boost/preprocessor/seq/enum.hpp>

// 生成单个结构体成员的参数表达式:structName.member
#define MEMBER_ARG(r, structName, elem) structName.BOOST_PP_SEQ_ELEM(1, elem)

// 批量生成参数列表并调用函数
#define PASS_MEMBERS_TO_FUNCTION(structName, members) \
    function(BOOST_PP_SEQ_ENUM(BOOST_PP_SEQ_TRANSFORM(MEMBER_ARG, structName, members)))

// 示例结构体
struct MyStruct {
    int height;
    double width;
    const char* name;
};

// 目标函数:参数顺序需与结构体成员传入顺序匹配
void function(int value, double width, const char* name) {
    std::cout << "Value: " << value << ", Width: " << width << ", Name: " << name << std::endl;
}

int main() {
    MyStruct myStruct{10, 20.5, "example"};
    // 传入结构体实例和成员序列((类型, 成员名)的序列)
    PASS_MEMBERS_TO_FUNCTION(myStruct, ((int, height))((double, width))((const char*, name)));

    return 0;
}

关键宏解释

  • MEMBER_ARG:将每个(类型, 成员名)的序列元素转换为structName.成员名的表达式。
  • BOOST_PP_SEQ_TRANSFORM:遍历成员序列,对每个元素应用MEMBER_ARG宏,生成包含所有成员参数的新序列。
  • BOOST_PP_SEQ_ENUM:将预处理序列转换为逗号分隔的参数列表,最终生成function(myStruct.height, myStruct.width, myStruct.name)的代码。

编译运行结果

运行后输出:

Value: 10, Width: 20.5, Name: example

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 05:35:08