使用C预处理器在结构字段上进行迭代
Use C preprocessor to iterate over structure fields
我有几个不同的C 结构和类带有相同名称的字段,我必须经常复制。我想做类似的事情:( bashy pseudocode)
struct S{double a;
double b;
double c;};
class C{public: void set_a(double a);
void set_b(double b);
void set_c(double c); };
S s; C c;
#FOR F in FIELDSOF(S)
c.set_${F}(${F});
#ENDFOR
是一个好主意,是否有办法滥用C 预处理器或C 模板来实现这一目标?我使用G 和Clang 。
我已经知道像Mako这样的模板引擎,而且我也知道我可以编写一个程序来进行代码生成。如果您必须知道,我想使用的一件事是从C 结构中填充Google Protobufs。
如果您已经具有增强依赖关系,则可以使用boost_fusion_adapt_struct并使用融合来迭代成员。这也使您可以使用类型,而这种类型是在纯预处理器方法中不可能的。
您还需要将成员功能映射到融合序列以使其更自动。
总的来说:只需写一个构造函数。
请参阅此答案,该答案显示了如何在类的成员上迭代。然后使用这些宏,这两个类可以像这样反射:
struct S
{
REFLECTABLE
(
(double) a,
(double) b,
(double) c
)
};
class C
{
private:
REFLECTABLE
(
(double) a,
(double) b,
(double) c
)
public:
void set_a(double a);
void set_b(double b);
void set_c(double c);
};
然后根据成员变量的名称创建一个通用分配:
struct assign_fields_visitor
{
template<class FieldData1, class FieldData2>
void operator()(FieldData1 fd1, FieldData2 fd2)
{
if (strcmp(fd1.name(), fd2.name()) == 0)
{
fd1.get() = fd2.get();
}
}
};
struct assign_fields
{
template<class X, class FieldData>
void operator()(X & x, FieldData f)
{
visit_each(x, boost::bind(assign_fields_visitor(), f, _1));
}
};
template<class L, class R>
void assign(L & lhs, const R& rhs)
{
visit_each(rhs, boost::bind(assign_fields(), boost::ref(lhs), _1));
}
最后,可以这样称呼:
S s; C c;
assign(c, s);
相关文章:
- 如何使用迭代器初始化地图的键字段?
- 您可以在一段时间内迭代向量
- 在相同类型的字段上迭代
- C 模板功能在任何集合成员字段上迭代
- 为什么从工厂函数分配向量并在循环中迭代它会导致段错误
- python+libclang;来回迭代:将字段注释绑定到字段
- 将迭代器映射到特定字段上的迭代器(可以使用 Boost)
- 在编译时使用模板在跨结构字段中迭代
- 段错误:使用迭代器的插入函数
- 正在取消引用自定义结构字段的迭代器
- 使用C预处理器在结构字段上进行迭代
- C++使用boost-fusion-adapt_struct迭代到嵌套结构字段中
- 如何在容器项的字段上创建迭代器?
- 在 65536 位置访问迭代器的指针运算符会导致段错误
- 取消引用的列表迭代器段错误
- 任务在删除其中一个迭代对象时会导致段错误
- C++ 如何在结构向量的一个字段上创建迭代器
- C++ std::vector<std::string> 迭代器段错误
- GDB Python脚本:通过C/C++结构字段迭代的任何示例
- 从任何结构或元组按字符串形式的字段键获取迭代器