【问题标题】:variants, existential polymorphism in c++C ++中的变体,存在多态性
【发布时间】:2012-03-23 05:56:55
【问题描述】:

我正在对类型系统进行研究。对于这项工作,我正在研究流行语言中变体、结构子类型、通用多态性和存在多态性的用法。像 heskell、ocaml 这样的函数式语言提供了这样的函数。但我想知道像 C++ 这样的流行语言是否提供上述功能。这意味着 C++ 是如何实现的

  1. 变体

  2. 结构子类型

  3. 通用多态性

  4. 存在多态性。

【问题讨论】:

  • 对于变体,你可以看看 boost.variant,其余的我不知道那可能是什么(这可能意味着你可以使用 variadic 模板来做)。
  • 你好,结构体和联合体可以实现变体吗?

标签: c++ types polymorphism variant subtype


【解决方案1】:
  1. 联合可以被视为变体的基本形式,但实际上,它们更像是一种覆盖内存的原始机制(并且不安全)。

  2. 在 C++ 中没有结构类型,更不用说子类型了。所有类型都是名义上的。

  3. 模板与通用多态性有一些表面上的相似性,但实际上却大不相同。从本质上讲,它们是美化的宏,几乎没有类型检查(就像宏一样,检查和代码生成都发生在扩展之后)。

  4. C++ 中没有存在类型的形式(Java 中有一种有限的形式,即通配符)。

其中一些功能可以在某种程度上使用子类型进行模拟,但仍然远不那么富有表现力(或方便)。

【讨论】:

  • 你可以通过不完整的类类型来模拟存在类型(最好的例子是 pimpl 成语),但这就是推动它。
  • boost::variant 是一个非常好的变体实现。概念提案实现了结构子类型,不是吗?另外,我对类型语义的系统发育了解不多……但是模板专业化偏序不算是严格的类型检查吗?这是在元程序中分派类型结构的重要工具。
  • 嗨,我正在研究基本的编程语言特性,这就是为什么我认为 boost::variant 不是一个好点。顺便说一句,运行时多态性是一种结构类型吗? @安德烈亚斯·罗斯伯格
  • @Potatoswatter:概念会给出类似于(有界)全称量化的东西,但他们从来没有做到这一点,而且真的说起来有点混乱(它们与结构类型的关系也是如此)。顺便说一句,对类型进行分派与参数多态性无关(事实上,它破坏了其中的“参数”)——在类型理论术语中,它更类似于内涵类型分析。
  • @Pbasak:就类型理论而言,不存在“运行时多态性”之类的东西 - 这只是(不幸的是)在 OO 圈子中广泛传播的混淆术语;)。无论如何,我看不出它与结构类型有什么关系。
猜你喜欢
  • 1970-01-01
  • 2023-04-09
  • 1970-01-01
  • 1970-01-01
  • 2013-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多