4

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

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

抛出boost::bad_any_cast异常。

这似乎违反了Liskov 替换原则并且不是很方便。有什么解决方法吗?

4

2 回答 2

5

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

它专门设计用于处理值类型(请参阅文档,您已经在其中发布了链接)。

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

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

于 2013-07-17T11:14:43.410 回答
0

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

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

于 2016-03-15T00:34:05.420 回答