【发布时间】:2014-09-30 13:31:23
【问题描述】:
我有一个任务要求为任何数据类型编写一个函数。该函数应该打印结构的字节并识别数据结构使用的字节总数以及区分用于成员和字节的字节用于填充。
我的直接反应以及大多数班级的反应是使用模板。这允许您编写一次函数并收集传递给函数的对象的运行时类型。使用 memset 和 typeid 可以轻松完成所要求的内容。然而,我们的教授。刚刚看到我们关于模板和该死的模板的讨论。
看到这个后,我陷入了困境,我正在寻找一些指导作为解决这个问题的最佳方法。我调查过的一些事情:
- 带有显式强制转换的空指针(这似乎会变得一团糟)
- 具有仅从其继承所有数据结构的虚函数的基类,这样做似乎有点奇怪。
- 对我们的每个数据结构都有“友谊”的基类。
- 为我们问题集中的每个数据结构重写一个函数(我想这是最糟糕的解决方案)。
希望我忽略了一个常见的 c++ 工具,有人有什么想法吗?
【问题讨论】:
-
如果您的 C++ 讲师将模板搞砸了,我真诚地希望现在为其他讲师放弃课程还为时不晚。可以肯定的是,有些东西应该被诅咒,但它不是模板。
-
即使使用模板也是不可能的。编译器(除非有一些非标准扩展)没有提供足够的运行时信息来确定类型布局的确切细节,而无需了解它。
-
你的目标到底是什么?将结构的原始内存分解为成员字节和填充字节?
-
您的讲师是否在寻找通用的独立于平台的解决方案?还是有一些 特定的 (例如 MS 编译器的调试输出,它在编译期间抛出布局信息)。后一个要求,通过
offsetof进行情感剖析,正如@DarkFalcon 所说,除非您连接到编译过程本身,否则如果不指定代码中的成员,您就无法做到这一点。 -
即使您使用模板,
memset将如何帮助您?