用现代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等方法,并且通过重载运算符实现了对负数索引

C#爬虫开发小结

前言 2023年以来一直很忙,临近春节,各种琐事更多,但鸽了太久没写文章总是不舒坦,忙中偷闲来记录下最近用C#写爬虫的一些笔记。 爬虫一般都是用Python来写,生态丰富,动态语言开发速度快,调试也很方便 但是 我要说但是,动态语言也有其局限性,笔者作为老爬虫带师,几乎各种语言都搞过,现在这个任务并

从优秀源码中学到的两个技巧

设计一个不能被using的对象 在实际开发中为了避免命名空间污染,一般都不会using namespace std。但是如果一个对象写起来比较复杂,用using能大幅度地简化操作。现在假设我们要设计一个函数,它在一个作用域里面,使用它只能以A::B::C()这种形式。思考一下,如果我们放在命名空间下

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

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

C#学习笔记--面向对象三大特征

C#核心 面向对象--封装 用程序来抽象现实世界,(万物皆对象)来编程实现功能。 三大特性:封装、继承、多态。 类与对象 声明位置:namespace中 样式:class 类名{} 命名:帕斯卡命名法(首字母大写) 实例化对象:根据类来新建一个对象。Person p=new Person(); 成员

[转帖]k8s集群内偶现无法访问外部域名怎么解?

故障现象 容器内频现无法访问外部服务,是用ping测试有如下现象: # ping baidu.com -c 4 PING baidu.com (110.242.68.66) 56(84) bytes of data. 64 bytes from 110.242.68.66 (110.242.68.6

Thread 和 ThreadPool 简单梳理(C#)【并发编程系列_3】

现在已经出现了 Task 和 PLinq 等更高效率的并发类,线程和线程池在实际开发中逐渐减少了,但是别人用了你也得能看懂,所以本文简单梳理一下。

RedisStack部署/持久化/安全/与C#项目集成

前言 Redis可好用了,速度快,支持的数据类型又多,最主要的是现在可以用来向量搜索了。 本文记录一下官方提供的 redis-stack 部署和配置过程。 关于 redis-stack redis-stack installs a Redis server with additional datab

C# 发送邮件功能

以前官方自带一个smpt类可以发送邮件,现在好像弃用了。虽然仍然可以使用,但总归不如先学一下新的方法。遂采用了微软官方推荐的一个第三方库:MailKit 还需引入另一个MimeKit库,用于创建消息。 我的发送邮件是扩展功能,所以是静态方法,所需的参数我将通过参数传递。遂定义一个email的实体类、

C++面向对象语言自制多级菜单

因为要做一个小应用,需要一个菜单类,在网上找了许久,也没有找到一款心仪的菜单类,索性用C++语言,自制一个命令行级别的菜单类,并制作成库,现记录下来,供以后借鉴。 一、特性 无限制条目 无限制层级 用户自定义条目和动作 脚本式生成菜单类 二、代码实现 (一)菜单类 菜单类主要负责菜单的创建、修改、删