gpt4 book ai didi

C++ 2a - 多态范围

转载 作者:行者123 更新时间:2023-12-02 10:06:04 26 4
gpt4 key购买 nike

我正在编写一个 C++ 库,并且有一个惊人的想法,即尽可能多地使用 C++2a/C++20。因此,我使用标准库概念并创建自己的。但是,函数返回 std::vector<X> 的想法对我来说似乎非 C++20 就足够了,所以我在我的概念中声明了一个返回类型匹配 std::ranges::view<X> .然后我实现了一些实现这个概念的类。

但是,当我想设计一个多态包装类时,问题就出现了。所以,假设这个概念是C我有三个实现类C1 , C2C3 (但允许更多)。现在我想创建一个类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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com