gpt4 book ai didi

c++ - 打印一个已知大小的结构

转载 作者:太空宇宙 更新时间:2023-11-04 15:56:43 24 4
gpt4 key购买 nike

我有一些结构可能包含一定数量的无符号整数(它们是 uint32_t 或 uint64_t)。我想以一种可以理解的方式打印出这些结构的值。例如,我可能有如下结构。

struct test {
uint32_t ab = 0;
uint64_t cd = 1;
uint32_t ef = 2;
};

我想我可以有一个方法来传递这个结构的地址,并使用这个结构的大小打印出来。但不确定如何编写代码。

最佳答案

如前所述,C++11 没有反射机制。获得成员列表的唯一方法是发挥你自己的机制。既然你提到每个成员总是有两种类型之一,它应该是相当简单的。例如,通过创建特征类。

template<class T>
struct mem_ptr {
// Tagged union type to generically refer to a member of a struct T
enum {u32, u64} alive;
union {
uint32_t T::* u32_ptr;
uint64_t T::* u64_ptr;
};
mem_ptr(uint32_t T::* u32_ptr) : alive(u32), u32_ptr(u32_ptr) {}
mem_ptr(uint64_t T::* u64_ptr) : alive(u64), u64_ptr(u64_ptr) {}
};

template<class> struct struct_members;

template<>
struct struct_members<test> {
mem_ptr<test> members[3] = {
&test::ab, &test::cd, &test::ef
};
};

template<class T>
auto operator<<(std::ostream& os, T const& str) -> decltype(struct_members<T>::members, os) {
struct_members<T> const mem;
char const *delim = "";
os << "{ ";
for(auto& m : mem.members) {
os << delim;
delim = ", ";
switch(m.alive) {
case m.u32: os << (str.*(m.u32_ptr)); break;
case m.u64: os << (str.*(m.u64_ptr)); break;
default: break;
}
}
os << " }";
return os;
}

wandbox 上对上述内容进行测试(双关语) , 打印:

{ 0, 1, 2 }

有了它,您可以通过为其定义 struct_members 表来添加对新结构的支持:

struct test2 {
uint32_t ab1 = 5;
uint64_t cd2 = 3;
uint32_t ef3 = 8;
};

template<>
struct struct_members<test2> {
mem_ptr<test2> members[3] = {
&test2::ab1, &test2::cd2, &test2::ef3
};
};

并且之前编写的流运算符也适用于它。

关于c++ - 打印一个已知大小的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55701801/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com