用现代C++写一个python的简易型list

现代,c++,一个,python,简易型,list · 浏览次数 : 7

小编点评

**简介:** `std::variant` 是一个泛型模板类,它实现了多种数据类型存储的机制,并支持对负数索引的访问。 **关键属性:** * `v` 是一个存储多种数据类型的容器。 * `std::holds_alternative` 函数检查给定的索引是否有效,允许使用 `if` 和 `else` 语句根据数据类型进行选择。 **方法:** * `append()`:向容器中添加一个新元素。 * `pop()`:从容器中移除最后一个元素。 * `front()`:返回容器的前元素。 * `back()`:返回容器的后元素。 * `size()`:返回容器中的元素数量。 * `operator[]()`:基于索引访问容器中的元素。 **重载运算符:** `std::variant` 支持重载运算符,允许使用不同的运算符访问相同的数据类型。例如,可以使用 `+` 来将 `int` 和 `double` 之间的元素相加,而可以使用 `-` 来访问 `int` 元素。 **示例:** ```cpp PythonList lst; // 添加元素 lst.append(1); lst.append(3.14); lst.append("Hello World"); // 获取元素 for (int i = 0; i < lst.size(); ++i) { if (std::holds_alternative(lst[i])) { std::cout << "Type: " << static_cast(lst[i]) << std::endl; } else if (std::holds_alternative(lst[i])) { std::cout << "Type: " << static_cast(lst[i]) << std::endl; } else if (std::holds_alternative(lst[i])) { std::cout << "Type: " << static_cast(lst[i]) << std::endl; } } ``` **结果:** ``` Type: 1 Type: double Type: string ``` **注意:** `std::variant` 需要使用 `std::holds_alternative` 等方法检查索引是否有效,否则可能导致异常。

正文

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,并且能实现自动析构。

与用现代C++写一个python的简易型list相似的内容:

用现代C++写一个python的简易型list

std::variant介绍:en.cppreference.com/w/cpp/utility/variant 通过泛型模板(仅提供了int, double, string三种类型的存储),实现了append, pop, front, back, size等方法,并且通过重载运算符实现了对负数索引

像go 一样 打造.NET 单文件应用程序的编译器项目bflat 发布 7.0版本

现代.NET和C#在低级/系统程序以及与C/C++/Rust等互操作方面的能力完全令各位刮目相看了,有人用C#开发的64位操作系统: GitHub - nifanfa/MOOS: C# x64 operating system pro...,截图要介绍的是一个结合Roslyn和NativeAOT的实

cmake-4

cmake-4学习,参考 cmake构建c++项目快速入门2-1 cmake构建c++项目快速入门2-2 了解 cmake的工作原理: Windows下用cmake编译cmake (1)先下载cmake(exe) (2)编译源码文件 # -S表示源文件夹下;-B表示新建一个文件夹build,并将编译

现代数据平台要实现自助用数,要解决的三个问题

摘要:华为云FusionInsight MRS HetuEngine持续提升自助用数分析平台的可服务、易运维能力,基于AI技术持续提升对数据分析平台的智能化赋能水平,引领现代数据分析平台向专业化、智能化、易运维、高性能方向演进。 本文分享自华为云社区《现代数据平台要实现自助用数还要解决的三大问题》,

测试人员都是画画大神,让我看看谁还不会用代码图?

给大家30秒的时间,一起来思考这是什么? 这是某系统登陆模块功能的初始类图。 随着现代软件的不断复杂化,代码图(Code Graphs)为测试人员提供了一种直观的方法,让复杂的代码逻辑易于理解。本文将深入探讨代码图,通过挖掘到的真实场景和实际示例,展示可视化代码图如何增强软件测试人员的能力以及如何开

[转帖]字符编码解惑

https://www.cnblogs.com/codelogs/p/16060234.html 简介# 现代编程语言都抽象出了String字符串这个概念,注意它是一个高级抽象,但是计算机中实际表示信息时,都是用的字节,所以就需要一种机制,让字符串与字节之间可以相互转换,这种转换机制就是字符编码,如

javascript import maps 特性现已被全部主流浏览器支持

值得庆祝 Import maps 特性现在可以在全部三个主要浏览器内使用 现在主流现代web 应用 引入和利用javascript 是通过 Es module 模块实现。 在开发javascript上,比起无模块化功能的旧版浏览器,现代浏览器支持模块化且提供了许多好用的功能 引入 es module

[转帖] 字符编码解惑

原创:打码日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处。 简介# 现代编程语言都抽象出了String字符串这个概念,注意它是一个高级抽象,但是计算机中实际表示信息时,都是用的字节,所以就需要一种机制,让字符串与字节之间可以相互转换,这种转换机制就是字符编码,如GBK,UTF-8

工作卷,是主动选择还是迫于无奈?

这个词是近几年流行起来的网络用语,它是内卷的简化形式,“内卷”本来是一个名不见经传的普通词语,经网络流传,很多人就用其来指代非理性的内部竞争或“被自愿”竞争。在现代职场,有一群人被戏称为"职场卷王"。他们本着累死自己、熬死领导的核心宗旨,总是作为最后一个熄灯人离开公司。我相信你们也肯定都“卷”过,甚...

[转帖]计算机体系结构-寄存器重命名

https://zhuanlan.zhihu.com/p/503257611 在 Tomasulo 一文中曾经提到过“寄存器重命名”这个概念。“寄存器重命名”的目的是消除指令间写后写、读后写这两种假数据冒险,在现代处理器中,“寄存器重命名”往往因为其实现的复杂性而被拿出来单独用一个周期(甚至两个周期