我目前正在编写一个 C++ 内存编辑库,对于读/写 API,我使用类型特征(std::is_pod、std::is_same)和 boost::enable_if 来提供 3 个重载:
- POD 类型。例如 MyMem.Read(SomeAddress);
- 字符串类型。例如 MyMem.Read>(SomeAddress); (这实际上并没有读出 C++ 字符串,它读出了 C 风格的字符串并将其转换为 C++ 字符串。)
- 向量类型。例如 MyMem.Read>(SomeAddress, NumElem); (这实际上并不读出向量,而是读出 C 风格的数组并将其转换为向量。)
重载 2 和 3 只是重载 1 的“包装器”。(因此,如果您正在读取 std::vector 或 std::basic_string 并且 T 不是 POD,它将失败,因为它应该。)
最近我想使用 std::array 进行一堆读取和写入,因为我知道在编译时我想要读取和写入的数据的大小(我正在编写一个 PE 文件格式的包装器)。
我编写了使用 std::array 的代码,然后打算添加另一个重载来检测和处理 std::array 类型,但我不小心点击了编译,令我惊讶的是它起作用了!
我目前正在使用 MSVC 10,事实证明,对于 std::array,如果 T 是 POD,则 std::array 是 POD。(这意味着我可以只使用重载 1 并且它可以工作。)
我的问题是这是由 C++ 标准保证还是由实现决定。
我知道我可以自己检查标准,但我对自己的信任不如对本网站上的一些语言律师的信任,所以我认为最好获得“第二意见”。;)
谢谢
PS 代码可在此处获得(它是仅标头库): http ://code.google.com/p/hadesmem/source/browse/trunk/HadesMem-v2/Hades-Memory/Hades-Memory/MemoryMgr.h#86