C++11中实现封装任意结构体的文件读写类的技术疑问
实现支持任意结构体的文件读写封装类(C++11)
我想要实现一个类,它可以创建任意结构体的实例,并且具备将这些结构体写入文件系统、从文件系统加载的方法。之前我是通过宏来实现这个功能的——宏接收结构体实例名称,完成读写操作。现在我想改用类对象来封装这些功能,但不清楚在C++11中如何向构造函数传递并使用任意结构体。我写了一段预期的代码示例(但代码存在语法问题):
struct typeA{ int age; int weight; }; struct typeB{ char name[10]; int height; }; class StructControl{ public: void target; StructControl(void ITEM){ ITEM target; } void S(void * addr,uint32_t size){ //code for saving } void L(void * addr, uint32_t size){ //code for loading } void Save(){ S(&target,sizeof(target)); } void Load(){ L(&target,sizeof(target)); } }; int main(){ StructControl myA(typeA); myA.target.age=45; myA.Save(); StructControl myB(typeB); myB.height=110; myB.Save(); }
解决方案:使用模板类实现
在C++11中,要实现支持任意结构体的封装类,模板类是最直接且类型安全的方案。模板可以让类适配任意结构体类型,同时避免宏的各种弊端。以下是修正后的可运行实现:
#include <cstdint> #include <fstream> struct typeA { int age; int weight; }; struct typeB { char name[10]; int height; }; template<typename T> class StructControl { private: // 实际执行文件写入的私有方法 void saveToFile(const void* addr, uint32_t size) { // 可根据需求修改文件名或路径 std::ofstream file("struct_data.bin", std::ios::binary | std::ios::out); if (file.is_open()) { file.write(reinterpret_cast<const char*>(addr), size); file.close(); } } // 实际执行文件读取的私有方法 void loadFromFile(void* addr, uint32_t size) { std::ifstream file("struct_data.bin", std::ios::binary | std::ios::in); if (file.is_open()) { file.read(reinterpret_cast<char*>(addr), size); file.close(); } } public: T target; // 存储目标结构体实例 // 默认构造函数,初始化结构体 StructControl() = default; // 支持传入结构体初始值的构造函数 explicit StructControl(const T& initVal) : target(initVal) {} // 对外暴露的保存接口 void Save() { saveToFile(&target, sizeof(target)); } // 对外暴露的加载接口 void Load() { loadFromFile(&target, sizeof(target)); } }; int main() { // 创建typeA的控制实例,操作结构体字段 StructControl<typeA> myA; myA.target.age = 45; myA.target.weight = 70; myA.Save(); // 创建typeB的控制实例,操作结构体字段 StructControl<typeB> myB; myB.target.height = 110; // 给name字段赋值(确保字符串以'\0'结尾) const char* userName = "Bob"; for (int i = 0; i < 9 && userName[i] != '\0'; ++i) { myB.target.name[i] = userName[i]; } myB.target.name[9] = '\0'; myB.Save(); return 0; }
关键说明
- 模板类
StructControl<T>通过模板参数T适配任意结构体类型,保证类型安全,不会出现原代码中void target的语法错误。 - 成员变量
target直接是模板参数类型T,可以直接访问结构体的所有字段,符合你的使用预期。 - 构造函数支持两种初始化方式:默认初始化或传入结构体初始值,适配不同场景。
- 读写方法内部用
std::fstream实现二进制文件操作,确保结构体的二进制数据完整写入/读取。 - 使用时只需通过
StructControl<结构体类型>的方式创建实例,操作简单直观。
内容的提问来源于stack exchange,提问作者jeffpkamp
相关产品推荐
相关产品推荐

