我发现不可能提取对boost::any
持有派生类型的基类型的引用:
boost::any holder = Derived();
const Base& base_ref = boost::any_cast<const Base&>(holder);
抛出boost::bad_any_cast
异常。
这似乎违反了Liskov 替换原则并且不是很方便。有什么解决方法吗?
我发现不可能提取对boost::any
持有派生类型的基类型的引用:
boost::any holder = Derived();
const Base& base_ref = boost::any_cast<const Base&>(holder);
抛出boost::bad_any_cast
异常。
这似乎违反了Liskov 替换原则并且不是很方便。有什么解决方法吗?
我不认为它“违反”了它-boost::any
不是为您使用它而设计的。
它专门设计用于处理值类型(请参阅文档,您已经在其中发布了链接)。
您必须将 any_cast 准确地转换为 any 变量所持有的类型;在引擎盖下,它正在检查 typeid。显然,在这种情况下const Base&
不匹配。Derived
std::shared_ptr< Base >
提供/几乎/您似乎想要的东西。或查看此处了解更多信息。
在代码编译和工作的意义上,替换原则仍然适用。的设计boost::any
会引发异常(如果需要,您可以从中恢复)。
另一种设计boost::any
可能会选择做一些不同的事情。对于更细粒度的 boost::any 版本,您可以查看 Boost.TypeErasure。(虽然可能std::unique_ptr
会做你想要的工作。)