C++17万能容器:std::any类

133 阅读1分钟

相关文章 zhuanlan.zhihu.com/p/589164471 www.jb51.net/article/236…

示例代码

#include <iostream>
#include <vector>
#include <any>
#include <string>

class MyClass {
public:
    MyClass(int value) : m_value(value) {}
    int getValue() const { return m_value; }

private:
    int m_value;
};

int main() {
    std::vector<std::any> anyVector;

    // 存储不同类型的值到向量中
    anyVector.push_back(42); // 整数
    anyVector.push_back(3.14); // 浮点数
    anyVector.push_back(std::string("Hello")); // 字符串
    anyVector.push_back(new MyClass(100)); // 指向自定义类的指针
    std::shared_ptr<MyClass> class_ptr = std::make_shared<MyClass>(99);
    anyVector.push_back(class_ptr);

    // 从向量中检索值并进行类型转换
    for (const auto& item : anyVector) {
        if (item.type() == typeid(int)) {
            std::cout << "Integer value: " << std::any_cast<int>(item) << std::endl;
        }
        else if (item.type() == typeid(double)) {
            std::cout << "Double value: " << std::any_cast<double>(item) << std::endl;
        }
        else if (item.type() == typeid(std::string)) {
            std::cout << "String value: " << std::any_cast<std::string>(item) << std::endl;
        }
        else if (item.type() == typeid(MyClass*)) {
            MyClass* myClassPtr = std::any_cast<MyClass*>(item);
            std::cout << "Value from MyClass pointer: " << myClassPtr->getValue() << std::endl;
        }
        else if (item.type() == typeid(std::shared_ptr<MyClass>)) {
            auto myClassSharedPtr = std::any_cast<std::shared_ptr<MyClass>>(item);
            std::cout << "Value from MyClass pointer: " << myClassSharedPtr->getValue() << std::endl;
        }
    }

    // 记得释放 MyClass 对象的指针内存
    for (auto& item : anyVector) {
        if (item.type() == typeid(MyClass*)) {
            delete std::any_cast<MyClass*>(item);
        }
    }

    return 0;
}