我发现从boost::any
中提取对基类型的引用是不可能的,它持有派生类型:
boost::any holder = Derived();
const Base& base_ref = boost::any_cast<const Base&>(holder);
抛出boost::bad_any_cast
例外。
这似乎违反Liskov substitution principle并且不太方便。有没有解决方法?
答案 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
将完成你想要的工作。)