能否借助Boost Preprocessor API将结构体所有成员传入函数?
利用Boost Preprocessor将结构体成员批量传入函数的修正方案
原代码核心问题
- 宏
PASS_MEMBER_TO_FUNCTION会为每个结构体成员单独生成一次function()调用,而实际需求是单次调用传入所有成员参数,这导致编译时出现多次参数列表不匹配的函数调用错误。 - 错误使用
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
相关产品推荐
相关产品推荐

