boost::任何违反利斯科夫替代原则

boost::any violates Liskov substitution principle

本文关键字:原则 任何违 boost      更新时间:2023-10-16

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

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

引发CCD_ 2异常。

这似乎违反了利斯科夫替代原则,而且不太方便。有什么变通办法吗?

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

它是专门为处理值类型而设计的(请参阅您已经发布了链接的文档)。

您必须将any_cast精确地设置为任意变量所保持的类型;在引擎盖下面,它正在检查typeid。显然,在这种情况下,const Base&Derived不匹配。

std::shared_ptr< Base >几乎提供了你想要的东西。或者查看此处了解更多信息。

在代码编译和工作的意义上,替换原则仍然适用。boost::any的设计是这样的,它会引发一个异常(如果你愿意,你可以从中恢复)。

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