【问题标题】:boost::any violates Liskov substitution principleboost::any 违反了 Liskov 替换原则
【发布时间】:2013-07-17 10:57:57
【问题描述】:

我发现不可能从持有派生类型的boost::any 中提取对基类型的引用:

boost::any holder = Derived();
const Base& base_ref = boost::any_cast<const Base&>(holder);

抛出 boost::bad_any_cast 异常。

这似乎违反了Liskov substitution principle,不太方便。有什么解决方法吗?

【问题讨论】:

  • C++ 是一种多范式语言,这意味着它不仅仅是面向对象编程。话虽如此,boost::any 显然不打算以多态方式使用,因此 LSP 不适用。

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


【解决方案1】:

我不认为它“违反”了它 - boost::any 不是为你使用它而设计的。

它是专门为使用值类型而设计的(请参阅文档,您已经在其中发布了链接)。

您必须将 any_cast 准确地转换为 any 变量所持有的类型;在引擎盖下,它正在检查 typeid。显然,在这种情况下,const Base&amp;Derived 不匹配。

std::shared_ptr&lt; Base &gt; 提供/几乎/您似乎想要的东西。或查看here 了解更多信息。

【讨论】:

  • 当然,如果我有一个可以传递的所有类型的通用基类,我会使用共享指针,但显然不是我的情况。
【解决方案2】:

在代码编译和工作的意义上,替换原则仍然适用。 boost::any 的设计使其引发异常(如果需要,您可以从中恢复)。

boost::any 的替代设计可能会选择做一些不同的事情。对于更细粒度的 boost::any 版本,您可以查看 Boost.TypeErasure。 (尽管std::unique_ptr 可能会完成您想要的工作。)

【讨论】:

    猜你喜欢
    • 2015-01-01
    • 1970-01-01
    • 2012-01-12
    • 1970-01-01
    • 2012-03-16
    • 2021-11-17
    • 2020-02-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多