boost :: any违反Liskov替换原则

时间:2013-07-17 10:57:57

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

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

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

抛出boost::bad_any_cast例外。

这似乎违反Liskov substitution principle并且不太方便。有没有解决方法?

2 个答案:

答案 0 :(得分:5)

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

它专门用于处理值类型(请参阅已发布链接的文档)。

你必须any_cast到任何变量所拥有的类型;在引擎盖下,它正在检查typeid。显然,const Base&在这种情况下不匹配Derived

std::shared_ptr< Base >提供/几乎/您想要的内容。或者查看here了解更多信息。

答案 1 :(得分:0)

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

boost::any的另一种设计可能会选择做一些不同的事情。对于更精细的boost :: any版本,您可以查看Boost.TypeErasure。 (虽然可能std::unique_ptr将完成你想要的工作。)