C++制作一个泛型容器(可以盛放各种类型的对象)

探讨了C++中如何实现动态类型存储的问题,提出了利用string结合类型ID标记的方法来存储不同类型的数据,并通过reinterpret_cast进行类型转换。

如果你想要一个可以盛放各种类型的对象,那么基本上可以说在C++里没有,或者你可以用vector<boost::any>或者其他的什么来模拟,我说那都不怎么好。问题就在于我的类型会在运行时动态的增加,你不可能知道我会增加什么类型,我的头文件也不会给你。

 

现在是不是觉得C++的泛型用不上了,是的,C++的泛型本质上是对相似代码的复用,做的事情都是同一件事情,但仅仅是处理类型的差别。这种情况用的还是比较少的,比如vector,queue,map等这些容器是用泛型的最好的地方了。但你想过没有,这些类型盛放的对象总是那么一种,就是vector<T> ,queue<T>,我现在要一种类型可以盛放各种对象,TA,TB,。。。。。怎么办呢

 

想来想去我想到了C语言的强制类型装换 TA ta  ;(TB)ta;,这个看起来一般的东东,其实威力无比,他就是C++中的 reinterpret_cast的原型,其功能就是对任意一个内存地址的内容进行重新解释。也就是说,不管你这块内存是什么,我把它强制解释为啥就是啥类型的对象了。

 

这样以来,其实我只需要一个string就可以保存任何类型的对象了,不是吗?

 

那么vector<string>也就是这种泛型的容器了。那类型放在哪里存放呢?记住朱总说的:规约大于配置,你可以把int类型用(char)1标记、把TA类型用(char)2标记,如此等等,你可以自定义你打算放入容器中的类型的id编号,取的时候只要先判断这个编号就知道里面盛放的是啥类型的对象了。是不是很嗨皮,我不知道有些人是不是不屑,或者说C++已经有了完美的解决方案而我还不知道而已,欢迎批评指正。

 

你应该这样将对象放到容器中:

string string_record(1,1);
string_record.append(string((char*)&data1,(char*)&data1 + sizeof(e_eledata)));

你会这么取出你的对象并使用:

cout<<"type : "<<(int)data_array1[i][0]<<endl;
cout<<"message : "<<*(e_eledata*)(data_array1[i].c_str()+1)<<endl;
string s ;
get_decode((int)data_array1[i][0])->decode(data_array1[i].substr(1,data_array1[i].size()-1),s);

 

以上仅仅是抛砖引玉,欢迎各路高手给出更好的方法

 

### 如何使用 C++ 创建容器C++ 中,可以通过模板机制来创建容器。这种设计允许容器存储任意类对象,而无需提前指定具体的数据类。以下是关于如何实现一个简单的容器的详细介绍。 #### 使用模板定义容器 通过 `template` 关键字可以定义支持多种数据类的类或函数。下面是一个基于模板的简单容器示例: ```cpp // 定义一个通用的动态数组容器 template<typename T> class GenericContainer { private: T* data; size_t capacity; size_t size; public: // 构造函数初始化容量 explicit GenericContainer(size_t initialCapacity = 10) : capacity(initialCapacity), size(0), data(new T[capacity]) {} ~GenericContainer() { delete[] data; } // 添加元素到容器中 void add(const T& value) { if (size >= capacity) { resize(capacity * 2); } data[size++] = value; } // 获取特定索引处的元素 T get(size_t index) const { if (index >= size) throw std::out_of_range("Index out of range"); return data[index]; } // 返回当前大小 size_t getSize() const { return size; } private: // 动态调整容器容量 void resize(size_t newCapacity) { T* newData = new T[newCapacity]; for (size_t i = 0; i < size; ++i) { newData[i] = data[i]; } delete[] data; data = newData; capacity = newCapacity; } }; ``` 此代码片段展示了一个基本的容器实现[^1]。它利用了模板参数 `T` 来表示容器内部存储的对象,并提供了添加元素、获取元素以及管理内存的功能。 #### 结合标准库功能增强容器 除了自定义逻辑外,还可以借助 STL 提供的标准工具进一步扩展容器的能力。例如,可以引入 `<any>` 类用于处理未知类的值,或者使用 `std::for_each` 遍历容器中的所有元素并执行操作[^3]。 ##### 示例:结合 `std::any` 的容器 如果希望容器能够容纳不同类的值,则可采用如下方式: ```cpp #include <vector> #include <any> #include <iostream> class MixedTypeContainer { private: std::vector<std::any> elements; public: void addElement(const std::any& element) { elements.push_back(element); } template<typename T> bool getElementAt(int index, T& result) { try { result = std::any_cast<T>(elements.at(index)); return true; } catch (...) { return false; } } void printElements() { for (auto& elem : elements) { if (elem.type() == typeid(int)) { std::cout << "Integer: " << std::any_cast<int>(elem) << "\n"; } else if (elem.type() == typeid(std::string)) { std::cout << "String: " << std::any_cast<std::string>(elem) << "\n"; } else { std::cout << "Unknown type\n"; } } } }; int main() { MixedTypeContainer container; container.addElement(42); container.addElement(std::string("Hello")); container.printElements(); } ``` 这段程序展示了如何构建一个多类兼容的容器实例[^2]。其中运用到了 `std::any` 和异常捕获技术以确保运行时的安全性和灵活性。 --- ### 总结 以上介绍了两种不同的方法来创建 C++ 容器——一种完全依赖于模板机制;另一种则融合了现代 C++ 特性如 `std::any`。开发者可以根据实际需求选择合适的方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

C++程序员Carea

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值