首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++ 2a -多态范围

C++ 2a -多态范围
EN

Stack Overflow用户
提问于 2020-02-13 06:07:51
回答 1查看 679关注 0票数 2

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

然而,当我想设计一个多态包装类时,问题出现了。因此,假设概念是C,我有三个实现类C1C2C3 (但允许更多)。现在,我想要创建一个类C_virtual和一个派生自它的模板C_virtual_impl<C c>,这将允许我从多形性上引用所有实现C的类。但是,要做到这一点,我需要一个多态std::ranges::view包装器,在精神上类似于C_virtual

在标头和C++引用中,我没有看到任何这样的类。此外,当我开始自己实现它时,我很快发现由于对迭代器的某些要求,特别是默认的可构造性、可互换性和类似的要求,我自己也无法实现。

标准库中是否有一个不明显的解决方案或成语?如果没有,我该如何处理这个问题?也许改变设计是可行的。我当然不想返回std::vector<X>或返回V<X>,其中V将是C的类型参数。我该怎么做?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-13 07:24:42

Range视图和许多其他模板技术不适合与基于继承的多态性一起使用.这很像vector<BaseClass>不是特别有用的原因。

如果您需要运行时多态性,那么您想要的工具不是继承(直接),而是类型擦除。也就是说,您有一些视图包装器,它使用类型擦除将各种视图操作转发到擦除类型。这还需要与类型擦除的迭代器配对,后者封装给定视图的迭代器。

当然,这意味着视图的特征必须由类型擦除的包装器定义。包装器可以实现input_range概念,但它不能实现比input_range本身更多的功能。即使在包装器中放置了contiguous_range类型,包装器也会将接口限制在input_range的接口上。

因此,最好避免这种情况,只要有可能就通过模板依赖静态多态性。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60201412

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档