boost :: any违反Liskov替换原则

liz*_*isk 4 c++ polymorphism boost type-erasure boost-any

我发现无法提取对boost::any包含派生类型的基类型的引用:

boost::any holder = Derived();
const Base& base_ref = boost::any_cast<const Base&>(holder);
Run Code Online (Sandbox Code Playgroud)

抛出一个boost::bad_any_cast例外.

这似乎是违反Liskov替代原则并不是很方便.有没有解决方法?

Ste*_*ove 5

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

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

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

std::shared_ptr< Base >提供/几乎/你想要的东西.或者在这里查看更多信息.