C++可变参数容器

在 C++ 里,可变参数容器指的是能够容纳不同数量和类型元素的容器,这里将从标准库提供的可变参数模板和相关容器,以及自定义可变参数容器的实现思路来详细介绍。

标准库中的可变参数模板与相关容器

std::tuple
  • 简介std::tuple 是 C++ 标准库中的一个模板类,它可以存储不同类型和数量的元素,是一个固定大小的异质集合。
  • 示例代码
#include <iostream>
#include <tuple>

int main() {
    // 创建一个包含不同类型元素的 tuple
    auto myTuple = std::make_tuple(10, "Hello", 3.14);

    // 访问 tuple 中的元素
    std::cout << std::get<0>(myTuple) << std::endl; // 输出 10
    std::cout << std::get<1>(myTuple) << std::endl; // 输出 Hello
    std::cout << std::get<2>(myTuple) << std::endl; // 输出 3.14

    return 0;
}
  • 代码解释
    • std::make_tuple 用于创建一个 std::tuple 对象。
    • std::get<N>(myTuple) 用于访问 std::tuple 中第 N 个元素(N 从 0 开始)。
std::variant
  • 简介std::variant 是 C++17 引入的类型安全的联合体,它可以存储多种类型中的一种,但同一时间只能存储一个值。
  • 示例代码
#include <iostream>
#include <variant>

int main() {
    std::variant<int, std::string> var;
    var = 10;
    std::cout << std::get<int>(var) << std::endl; // 输出 10

    var = "Hello";
    std::cout << std::get<std::string>(var) << std::endl; // 输出 Hello

    return 0;
}
  • 代码解释
    • std::variant<int, std::string> 表示这个 variant 可以存储 intstd::string 类型的值。
    • std::get<T>(var) 用于获取 variant 中存储的 T 类型的值,如果类型不匹配会抛出异常。
std::any
  • 简介std::any 是 C++17 引入的一个类型安全的容器,它可以存储任意类型的值。
  • 示例代码
#include <iostream>
#include <any>

int main() {
    std::any anyValue;
    anyValue = 10;
    if (anyValue.type() == typeid(int)) {
        std::cout << std::any_cast<int>(anyValue) << std::endl; // 输出 10
    }

    anyValue = "Hello";
    if (anyValue.type() == typeid(const char*)) {
        std::cout << std::any_cast<const char*>(anyValue) << std::endl; // 输出 Hello
    }

    return 0;
}
  • 代码解释
    • std::any 可以存储任意类型的值。
    • anyValue.type() 用于获取存储值的类型信息。
    • std::any_cast<T>(anyValue) 用于将 any 中的值转换为 T 类型,如果类型不匹配会抛出异常。

自定义可变参数容器

实现思路

可以利用 C++ 的可变参数模板来实现一个简单的可变参数容器。以下是一个示例:

#include <iostream>
#include <vector>

// 可变参数模板类
template<typename... Args>
class CustomContainer {
private:
    std::vector<std::tuple<Args...>> data;

public:
    // 插入元素
    void insert(Args... args) {
        data.emplace_back(args...);
    }

    // 打印元素
    void print() {
        for (const auto& tuple : data) {
            std::apply([](const auto&... elements) {
                ((std::cout << elements << " "), ...);
                std::cout << std::endl;
            }, tuple);
        }
    }
};

int main() {
    CustomContainer<int, std::string> container;
    container.insert(1, "Hello");
    container.insert(2, "World");
    container.print();

    return 0;
}
代码解释
  • template<typename... Args> 是可变参数模板的声明,表示可以接受任意数量和类型的模板参数。
  • std::vector<std::tuple<Args...>> data 用于存储元素,每个元素是一个 std::tuple
  • insert 函数用于向容器中插入元素,使用 emplace_back 将元素打包成 std::tuple 并添加到 data 中。
  • print 函数使用 std::apply 和折叠表达式来遍历并打印容器中的元素。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值