C++ any 类:储存任意类型值并实现类型转换
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;
}
类功能说明
-
构造函数:
- 默认构造函数:初始化
data为nullptr。 - 模板构造函数:接受任意类型的参数,并创建一个
holder对象来储存该值。 - 拷贝构造函数:复制
other对象的data指针。
- 默认构造函数:初始化
-
析构函数: 删除
data指针指向的内存。 -
赋值运算符:
- 拷贝赋值运算符:将
other对象的data指针复制到当前对象。 - 模板赋值运算符:接受任意类型的参数,并创建一个新的
holder对象来储存该值。
- 拷贝赋值运算符:将
-
类型转换函数
cast():- 接受一个模板类型参数
T。 - 检查
data指针是否指向holder<T>类型。 - 如果类型匹配,则返回
holder<T>对象中的value。 - 如果类型不匹配,则抛出
std::bad_cast异常。
- 接受一个模板类型参数
总结
any 类是一个方便的工具,可以用来储存任意类型的值,并提供类型转换功能。它使用基类和模板类来实现类型擦除,并包含必要的构造函数、赋值运算符和类型转换函数,方便用户灵活操作不同类型的值。但是需要注意,any 类并没有实现完整的线程安全机制,在实际应用中需要根据具体情况进行扩展和优化。
原文地址: https://www.cveoy.top/t/topic/pYtx 著作权归作者所有。请勿转载和采集!