C++ any 类:储存任意类型值并实现类型转换

本文介绍了如何在 C++ 中实现一个名为 any 的类,用于储存任意类型的值并提供类型转换功能。该类利用基类和模板类来实现类型擦除,并包含拷贝构造函数、重载赋值运算符、类型转换函数 cast() 等,方便用户灵活操作不同类型的值。

代码实现

#include <iostream>
#include <typeinfo>

class any {
public:
    any() : data(nullptr) {}
    
    template<typename T>
    any(const T& value) : data(new holder<T>(value)) {}

    any(const any& other) : data(other.data ? other.data->clone() : nullptr) {}

    ~any() { delete data; }

    any& operator=(const any& other) {
        if (this != &other) {
            delete data;
            data = other.data ? other.data->clone() : nullptr;
        }
        return *this;
    }

    template<typename T>
    any& operator=(const T& value) {
        delete data;
        data = new holder<T>(value);
        return *this;
    }

    template<typename T>
    T cast() const {
        if (data && typeid(holder<T>) == typeid(*data)) {
            return static_cast<holder<T>*>(data)->value;
        }
        throw std::bad_cast();
    }

private:
    class base_holder {
    public:
        virtual ~base_holder() {}
        virtual base_holder* clone() const = 0;
    };

    template<typename T>
    class holder : public base_holder {
    public:
        holder(const T& value) : value(value) {}
        virtual base_holder* clone() const override { return new holder<T>(value); }
        T value;
    };

    base_holder* data;
};

int main() {
    any a = 123;
    std::cout << a.cast<int>() << std::endl;

    any b = 'hello';
    std::cout << b.cast<const char*>() << std::endl;

    any c = a;
    std::cout << c.cast<int>() << std::endl;

    c = 'world';
    std::cout << c.cast<const char*>() << std::endl;

    try {
        std::cout << c.cast<int>() << std::endl; // 会抛出std::bad_cast异常
    } catch (const std::bad_cast& e) {
        std::cout << 'Failed to cast to int.' << std::endl;
    }

    return 0;
}

类功能说明

  • 构造函数:

    • 默认构造函数:初始化 datanullptr
    • 模板构造函数:接受任意类型的参数,并创建一个 holder 对象来储存该值。
    • 拷贝构造函数:复制 other 对象的 data 指针。
  • 析构函数: 删除 data 指针指向的内存。

  • 赋值运算符:

    • 拷贝赋值运算符:将 other 对象的 data 指针复制到当前对象。
    • 模板赋值运算符:接受任意类型的参数,并创建一个新的 holder 对象来储存该值。
  • 类型转换函数 cast():

    • 接受一个模板类型参数 T
    • 检查 data 指针是否指向 holder<T> 类型。
    • 如果类型匹配,则返回 holder<T> 对象中的 value
    • 如果类型不匹配,则抛出 std::bad_cast 异常。

总结

any 类是一个方便的工具,可以用来储存任意类型的值,并提供类型转换功能。它使用基类和模板类来实现类型擦除,并包含必要的构造函数、赋值运算符和类型转换函数,方便用户灵活操作不同类型的值。但是需要注意,any 类并没有实现完整的线程安全机制,在实际应用中需要根据具体情况进行扩展和优化。

C++ any 类:储存任意类型值并实现类型转换

原文地址: https://www.cveoy.top/t/topic/pYtx 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录