boost::任何违反利斯科夫替代原则
boost::any violates Liskov substitution principle
我发现不可能从持有派生类型的boost::any
中提取对基类型的引用:
boost::any holder = Derived();
const Base& base_ref = boost::any_cast<const Base&>(holder);
引发CCD_ 2异常。
这似乎违反了利斯科夫替代原则,而且不太方便。有什么变通办法吗?
我不认为它"违反"了它-boost::any
不是为你使用它而设计的。
它是专门为处理值类型而设计的(请参阅您已经发布了链接的文档)。
您必须将any_cast精确地设置为任意变量所保持的类型;在引擎盖下面,它正在检查typeid。显然,在这种情况下,const Base&
与Derived
不匹配。
std::shared_ptr< Base >
几乎提供了你想要的东西。或者查看此处了解更多信息。
在代码编译和工作的意义上,替换原则仍然适用。boost::any
的设计是这样的,它会引发一个异常(如果你愿意,你可以从中恢复)。
boost::any
的替代设计可以选择做一些不同的事情。对于更细粒度的boost::any版本,您可以查看boost.TypeErasure。(尽管可能std::unique_ptr
会完成您想要的工作。)
相关文章:
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 奇怪的(对我来说)返回声明 - 在谷歌上找不到任何关于它的信息
- 如何在不产生任何垃圾的情况下获得C中的像素
- 为什么我不能在 C++ 中的特定函数重载中调用同一函数的任何其他重载?
- C++映射有2个键,这样任何1个键都可以用来获取值
- Visual Studio(或任何其他工具)能否将地址解释为调用堆栈(boost上下文)的开头
- RtlCaptureStackBackTrace未捕获任何帧
- 链表c++插入,所有情况都已检查,但没有任何工作
- C++模板函数,用于比较任何无符号整数和有符号整数
- Arduino millis() - millis() 怎么能等于 0 以外的任何东西?
- 尝试摆脱任何堆内存分配
- 是否有任何C++功能可以对地图进行排序?
- 打印时有二叉树问题.用户输入不打印任何内容
- 共享指针和具有自定义删除程序的唯一指针之间的语法差异背后的任何原因
- 在C++行尾写一个分号或多个分号是否会改变任何内容
- C++类型特征,以查看是否可以<uint32_t>对类型"K"的任何变量调用"static_cast(k)"
- C++ 将 CIN 值存储到任何类型的数组中
- 为什么瓦尔格林德在不释放恶意内存后没有报告任何问题?
- GStreamer在开始任何播放之前进行搜索
- boost::任何违反利斯科夫替代原则