当前位置: 首页 > news >正文

c++11的动态类型

c++17引入了any 和 variant,可以将任意数据类型统一用any或variant类型表示,在开发中还是能够带来很多便利的。在c++11版本中,可以用下面这个例子,仿照实现一个Any类型。

#include <iostream>
#include <stdexcept>
#include <memory>class UserData{
public:UserData(){}std::string operator()(){return m_name;}
private:std::string m_name="world";
};class Any
{
public:template<typename T>Any(const T& val) noexcept : content(new Holder<T>(val)) {}Any(const Any& other) noexcept : content(other.content ? other.content->Copy() : nullptr) {}Any(Any&& other) noexcept :content(std::move(other.content)) {}Any& operator=(const Any& other){if (this == &other)return *this;content.reset(other.content ? other.content->Copy() : nullptr);return *this;}template<typename T>T& get() const{if (content.get() == nullptr){throw std::exception_ptr();}if (typeid(T).hash_code() != content->TypeID()){throw std::bad_cast();}return static_cast<Holder<T>*>(content.get())->value;}std::string TypeName() const{if (content)return content->TypeName();return "";}size_t TypeID(){if (content)return content->TypeID();return 0;}
private:struct Base {virtual ~Base() {}virtual Base* Copy() const = 0;virtual size_t TypeID() const = 0;virtual const char* TypeName() const = 0;};template<typename T>struct Holder :public Base{Holder<T>() = delete;Holder<T>(const T& val) : value(val), typid(typeid(T).hash_code()), typname(typeid(T).name()) {}~Holder<T>() {}Base* Copy() const override { return new Holder<T>(value); }size_t TypeID() const override { return typid; }const char* TypeName() const override { return typname; }T value;size_t typid;const char* typname;};std::unique_ptr<Base> content;
};int main()
{int iVal = 10;Any param = iVal;int& iv = param.get<int>();iv = 100;std::cout<<param.TypeName()<<", val="<<param.get<int>()<<std::endl;std::string sVal="hello";param = sVal;std::cout<<param.TypeName()<<", val="<<param.get<std::string>()<<std::endl;double dVal = 101.21;Any paramd = dVal;param = paramd;std::cout<<param.TypeName()<<", val="<<param.get<double>()<<std::endl;UserData data;param = data;UserData& dt = param.get<UserData>();std::cout<<param.TypeName()<<", val="<<dt()<<std::endl;return 0;
}

http://www.lryc.cn/news/489755.html

相关文章:

  • 付费会员渗透难,腾讯音乐的触顶挑战
  • 内网安全隧道搭建-ngrok-frp-nps-sapp
  • Load-Balanced-Online-OJ(负载均衡式在线OJ)
  • Postman之变量操作
  • 查找字符串中某个字符返回字符位置
  • 《数学物理学报》
  • 39页PDF | 毕马威_数据资产运营白皮书(限免下载)
  • K8s 一键部署 MongoDB 的 Replica-Set 和 MongoDB-Express
  • 2024小迪安全基础入门第四课
  • 一文详解使用java easyexcel导出文件的几种情况
  • 【蓝桥杯C/C++】深入解析I/O高效性能优化:std::ios::sync_with_stdio(false)
  • NUXT3学习日记四(路由中间件、导航守卫)
  • 数据科学与SQL:组距分组分析 | 区间分布问题
  • odoo18中模型的常用字段类型
  • 【如何用更少的数据作出更好的决策】-gpt生成
  • ara::com 与 AUTOSAR 元模型的关系总结
  • springboot整合hive
  • 浅谈 proxy
  • Ansys Maxwell:SheetScan - 导入材料特性曲线
  • 解决 Android 单元测试 No tests found for given includes:
  • 人工智能的核心思想-神经网络
  • JAVA中的Lamda表达式
  • 锂电池学习笔记(一) 初识锂电池
  • 深度学习2
  • 第六节-AppScan扫描报告
  • 【c++丨STL】stack和queue的使用及模拟实现
  • 基于SpringBoot的在线教育系统【附源码】
  • Kafka-副本分配策略
  • 市场波动不断,如何自我提高交易心理韧性?
  • 加速科技精彩亮相中国国际半导体博览会IC China 2024