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

C# 里的 dynamic 或者 object 在 C++ 里的对应

在 C# 中,object 是所有类型的基类(万物皆对象),而 dynamic 则把类型检查推迟到了运行时。

但在 C++ 中,没有统一的基类,且为了追求性能,C++ 倾向于在编译期就搞定一切。

C++ 应对“不确定类型”的需求,演化出了三套完全不同的“硬核”方案:


1. 静态多态:模板 (Templates)

—— 对应 C# 的 Generics,但比它强得多

C# 的泛型在编译后会保留一份元数据,运行时的行为相对受限。而 C++ 的模板是“代码生成器”

  • 原理:当你写 T 时,编译器会根据你传入的类型,在编译阶段硬生生地为你生成一份专门的代码
  • 硬核点:C++ 模板支持鸭子类型(Duck Typing)。只要你的类里有 void Shout() 方法,你就能把它传给模板函数,不需要像 C# 那样必须实现某个 IInterface
template<typename T>
void MakeItSpeak(T& animal) {animal.Speak(); // 只要 T 有 Speak 方法就能编译,没有接口约束!
}

2. 类型的“瑞士军刀”:std::variant (C++17)

—— 对应 C# 中受限的 objectunion 的高级版

如果你知道某个变量只会在 intstringdouble 之间切换,你应该使用 std::variant。它是类型安全的联合体。

  • 对比 object**object 是在堆上分配内存并装箱(Boxing),而 std::variant 通常在栈**上,且大小是其中最大成员的大小,性能极高。
  • 访问方式:你不能随便强转,必须使用 std::getstd::visit(类似于模式匹配)。
#include <variant>
#include <string>std::variant<int, std::string> v;
v = 10;       // 现在它存的是 int
v = "Hello";  // 现在它自动切换成了 string

3. 真正的“万能容器”:std::any (C++17)

**—— 对应 C# 的 object**

如果你真的完全不知道会存什么,std::any 就是 C++ 版本的 object

  • 行为:它可以存储任何类型的值。
  • 代价:它会进行动态内存分配(类似于 C# 的装箱),且由于 C++ 没有反射(Reflection),你取出来时必须显式知道它原本是什么类型,否则会抛出异常。
#include <any>std::any a = 42;
a = std::string("C++ is hard");// 取出来时必须强制转换(any_cast)
std::string s = std::any_cast<std::string>(a); 

4. 动态行为的终极方案:虚拟函数

**—— 对应 C# 的 virtual / override**

这是最接近 C# 习惯的做法。通过基类指针指向派生类对象。但区别在于:C++ 默认不是虚函数。你必须显式写下 virtual,编译器才会为你创建 虚函数表(vtable)


总结:C++ 为什么比 C# “硬核”?

特性 C# 的做法 C++ 的对应物 核心区别
万能基类 object std::any C++ 需要显式转换,且有性能开销。
泛型/动态 Generics / dynamic Templates C++ 在编译期生成代码,零运行时开销。
多类型切换 接口或继承 std::variant C++ 可以在栈上完成,无需 GC。

给你的避坑指南:

  1. **别在 C++ 里到处用 std::any**:这会被视为设计不佳。C++ 程序员推崇“在编译期确定类型”。
  2. 拥抱模板:虽然语法看起来像一堆乱码(比如 template <typename T> ...),但它是 C++ 性能强大的根源。
http://www.jsqmd.com/news/421768/

相关文章:

  • 在文本行内加个倒计时(循环)
  • 二进制部署 kafka 4.20 并开启认证
  • 论文写作神器:免费大纲,降AI率,轻松通过知网
  • WPForms 与 OptinMonster 结合:如何构建功能强大的浮动联系表单
  • 学术写作不求人:2026论文“去AI化”与降重软件盘点
  • 岩石的剪胀性
  • 收藏!揭秘Deepseek爆火背后的AI力量,企业如何借力实现数字化转型?
  • 2026年硕士论文攻略:从初稿生成到降AI率的工具合集
  • 别等被AI甩下!程序员收藏:AI转型不慌,这5大工具让你效率起飞!
  • 2026年AI趋势:落地为王!省钱、解决真问题才是硬道理,收藏看懂未来!
  • 最佳少儿编程APP推荐:为孩子选择合适的编程学习工具 - 品牌测评鉴赏家
  • 研究生论文写作神器:免费生成大纲,一键降AI率!
  • LazyLLM黑科技 | 继承就能自动注册?元类注册机制深度解析
  • 9个优质少儿编程免费体验课全面对比及学习场景分析 为什么要先让孩子试免费的少儿编程课? - 品牌测评鉴赏家
  • 国密算法+国产系统,KU 2208-H3海光服务器筑牢工控安全防线
  • 位运算符
  • SOLID、DRY、KISS、YAGNI 原则 / OWASP 安全最佳实践
  • SpringAI+Qwen3-8B打造本地知识库系统!代码+教程,速收藏!
  • 哪款蛋白粉适合中老年?2026最好最安全老年人蛋白粉品牌推荐,认准刚需别乱买 - 资讯焦点
  • Datawhale干货:5分钟上手!大语言模型驱动的智能体初探,收藏这份进阶指南!
  • 本科留学中介选校PK:TOP10机构保底G5不是随便说说 - 博客湾
  • 大模型来袭!程序员不进则退,收藏这波干货,教你从代码工匠变身AI架构师!
  • BXMya 3ASC25H214 DATX130 分布式I/O模块
  • 哪个牌子的深海鱼油质量好最好用?2026最好用的鱼油排行榜,5大维度优势 - 资讯焦点
  • 本科留学中介排名TOP10:牛剑G5面邀率谁家最强 - 博客湾
  • PROMPT_COMMAND PS1 tty阻塞
  • 香港留学中介策略排名:科学申请策略帮你稳拿Offer - 博客湾
  • epa含量最高的深海鱼油什么牌子好?2026最佳鱼油排行榜TOP8,搞定营养需求 - 资讯焦点
  • 香港留学中介榜单:专攻港新的机构有哪些优势 - 博客湾
  • 基于51单片机智能直流电机控制PWM调速系统设计DIY18-692