- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在编写一个 C++ 库,并且有一个惊人的想法,即尽可能多地使用 C++2a/C++20。因此,我使用标准库概念并创建自己的。但是,函数返回 std::vector<X>
的想法对我来说似乎非 C++20 就足够了,所以我在我的概念中声明了一个返回类型匹配 std::ranges::view<X>
.然后我实现了一些实现这个概念的类。
但是,当我想设计一个多态包装类时,问题就出现了。所以,假设这个概念是C
我有三个实现类C1
, C2
和 C3
(但允许更多)。现在我想创建一个类C_virtual
和模板C_virtual_impl<C c>
从它派生,这将允许我引用所有满足 C
的类多态的。但是,为此我需要一个多态的 std::ranges::view
包装器,在精神上类似于 C_virtual
.
我在标题和 C++ 引用中没有看到任何这样的类。此外,当我自己开始实现它时,由于对迭代器的一些要求,特别是默认的可构造性、可交换性等,我很快发现自己无法实现。
标准库或成语中是否有不明显的解决方案?如果没有,我该如何处理这个问题?可能会改变设计。我当然不想返回 std::vector<X>
或返回 V<X>
在哪里 V
将是 C
的类型参数.我该怎么做呢?
最佳答案
范围 View 和许多其他模板技术不适用于基于继承的多态性。这很像 vector<BaseClass>
不是特别有用。
如果你需要运行时多态,那么你想要的工具不是继承(直接);这是类型删除。也就是说,您有一些 View 包装器,它使用类型删除将各种 View 操作转发到删除的类型。这还需要与包装给定 View 的迭代器的类型删除迭代器配对。
当然,这意味着 View 的特征必须由类型删除包装器定义。包装器可以实现 input_range
概念,但它永远无法满足 input_range
本身。即使你把 contiguous_range
输入包装器,包装器会将接口(interface)限制为 input_range
的接口(interface).
因此,最好避免这种情况,并尽可能通过模板依赖静态多态性。
关于C++ 2a - 多态范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60201412/
我是一名优秀的程序员,十分优秀!