用现代C++写一个python的简易型list
std::variant介绍:en.cppreference.com/w/cpp/utility/variant
通过泛型模板(仅提供了int, double, string三种类型的存储),实现了append, pop, front, back, size等方法,并且通过重载运算符实现了对负数索引的访问。
#include <iostream>
#include <vector>
#include <variant>
#include <string>
class PythonList {
public:
template <class T>
void append(const T& item) {
v.push_back(item);
}
void pop() {
v.pop_back();
}
template <class T>
T& front() const {
return std::get<T>(v.front());
}
template <class T>
T& back() const {
return std::get<T>(v.back());
}
std::size_t size() const {
return v.size();
}
std::variant<int, double, std::string> operator[] (int index) const {
if (index >= 0)
return v[index];
std::size_t n{v.size()};
return v[n + index];
}
private:
std::vector<std::variant<int, double, std::string>> v;
};
int main() {
PythonList lst;
lst.append(1);
lst.append(3.14);
lst.append("Hello World");
int n = lst.size();
for (int i{}; i < n; ++i) {
if (std::holds_alternative<int>(lst[i]))
std::cout << "Type: int\n";
else if (std::holds_alternative<double>(lst[i]))
std::cout << "Type: double\n";
else if (std::holds_alternative<std::string>(lst[i]))
std::cout << "Type: string\n";
}
for (int i{-1}; i >= -3; --i) {
if (std::holds_alternative<int>(lst[i]))
std::cout << "Type: int\n";
else if (std::holds_alternative<double>(lst[i]))
std::cout << "Type: double\n";
else if (std::holds_alternative<std::string>(lst[i]))
std::cout << "Type: string\n";
}
}
如果不用variant,也可以通过union来实现不同类型的存储,variant可以视作为现代C++的union,并且能实现自动析构。
分类:
造轮子
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库