std :: any是否采用类型擦除,子类型或多态?

时间:2016-05-14 20:29:56

标签: c++ polymorphism type-erasure boost-any subtyping

在阅读boost anyexperimental any上的文档时, 我没有看到提及type erasure

我试图理解"键入擦除的概念"因为它适用于C ++。

说"任何"是否正确? type使用"类型擦除"存储其值时?
说它使用" polymorphism"是否正确?存储其值时?
是"类型擦除"一种多态性"?

关于polymorphism的维基百科文章,也未提及"键入删除"。
它提到" subtyping"。是"类型擦除"一种"子类型"?

很抱歉,如果这个问题出现在不同的方向。

总结一下,

如何"键入擦除"," polymorphsim"和"子类型"与C ++中的任何类型有关吗?

1 个答案:

答案 0 :(得分:1)

  

在存储其值时,“any”类型是否使用“type erasure”是否正确?

也许我和其他人对“类型擦除”有不同的定义,但使用类型擦除来实现any对我没有任何意义。如果我们使用定义"represent a variety of types through a single generic interface",那么anystd::function等符合该法案。 wikipedia定义“确保程序的运行时执行不依赖于类型信息”在C ++的上下文中没有任何意义。泛型(类型擦除的典型例子)并不意味着“从语言中删除类型”。此外,std::any(可选)使用RTTI。所以我会在维基百科以外寻找其他地方。

  

在存储其值时使用“polymorphism”是否正确?

多态性是实现any的一种方式。但是,这并不是必需的。据我所知,只有Boost使用多态。请参阅this answer

boost

其他实现表明它不是必需的:

libc++

libstdc++

另见this和随附的question

  

“类型擦除”是一种“多态”吗?

没有。您是否认为模板,泛型和std::function都是多态的?