【问题标题】:Are there any plans for a Standard type-erasing container?是否有任何标准类型擦除容器的计划?
【发布时间】:2014-05-24 09:34:04
【问题描述】:

多年来,将 boost 功能集成到标准库中的过程已经变得显而易见。

不过,boost 的一个有用且实用的部分,即提供类型擦除的容器,似乎已经摆脱了这个过程。

  1. 是否有任何特殊原因(性能损失、缺乏稳健性)?

  2. 是否有任何与在下一个标准库中合并此类功能(例如boost::any)相关的建议

  3. shared_pointer 使用类型擦除,今天的标准库中是否还有其他设施可以利用这种技术?

【问题讨论】:

  • "整合 提升 功能 融入 standard library" - 这就是创建 boost 的原因

标签: c++ boost c++14


【解决方案1】:
  1. 类型擦除通常会引入额外的间接调用,并最终引入会降低性能的虚函数调用。

  2. 最近更新的工作草案“C++ Extensions for Library Fundamentals”提出了(以及其他功能)boost::any for the standard

  3. std::function 是另一个例子。

【讨论】:

  • 还有一些提议允许struct 用作类型擦除模板:但是强大的反射可能让我们在库中执行此操作(foreach 类型中标记的方法,写入类型擦除代码之类的东西)。可能不是反射 1.0 ;)
  • @Yakk 你介意链接你在这里谈论的提案吗?谢谢。
  • @GuillaumeRacicot 天哪,那是 3 年前的事了。我不知道我现在在哪里看到的。对不起。如果我考虑在 7 到 10 年后做这件事,我希望反射提案和元类提案能够进入;然后,可以编写一个名为 type_erasure 的元类来生成所需的代码; type_erasure bob { int foo; void print(std::ostream&)const; }。这是一种比我在上面评论中描述的更“干净”的方式。
  • @Yakk 没问题我只是好奇,我不记得读过那个特别的提案:)
  • @GuillaumeRacicot 我记得看到一些带有结构的东西和一些运行在它上面的工具。不知道是求婚求婚,还是只是有人在谈论求婚,还是只是一个年轻的自己的狂热梦想。
【解决方案2】:

Boost.Any 以 std::any 的形式进入 C++17,但有一些不同。以及其他有用的类型构造函数:std::optionalstd::variant

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-03
    • 1970-01-01
    • 2015-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-08
    相关资源
    最近更新 更多