C++ 2a - 多态范围
C++ 2a - polymorphic range
我正在编写一个 C++ 库,并且有一个 惊人的 想法,即尽可能多地使用 C++2a/C++20。因此,我正在使用标准库概念并创建自己的概念。然而,函数 returning a std::vector<X>
的想法对我来说似乎 non-C++20 就足够了,所以我在我的概念中声明了一个 return 类型匹配 std::ranges::view<X>
.然后,我实施了一些实现此概念的 classes。
然而,当我想设计一个多态包装器时,问题出现了class。所以,假设这个概念是 C
,我有三个实现 classes C1
、C2
和 C3
(但允许更多)。现在我想创建一个 class C_virtual
和一个从它派生的模板 C_virtual_impl<C c>
,这将允许我引用所有 class 实现 C
的多态性。然而,为了让它工作,我需要一个多态的 std::ranges::view
包装器,在精神上类似于 C_virtual
.
我在 headers 和 C++ 参考中没有看到任何这样的 class。此外,当我开始自己实现它时,由于对迭代器的某些要求,特别是默认可构造性、可交换性和类似的要求,我很快发现自己无法实现。
标准库或成语中是否有不明显的解决方案?如果没有,我该如何处理这个问题?可能改变设计会奏效。我当然不想 return a std::vector<X>
或 return a V<X>
其中 V
将是 C
的类型参数。我该怎么做?
范围视图和许多其他模板技术并不意味着与基于继承的多态性一起使用。这很像 vector<BaseClass>
不是特别有用。
如果你需要运行时多态,那么你要的工具不是继承(直接);这是类型擦除。也就是说,您有一些视图包装器,它使用类型擦除将各种视图操作转发到已擦除的类型。这还需要与包装给定视图的迭代器的类型擦除迭代器配对。
当然,这意味着视图的特性必须由类型擦除包装器定义。包装器可以实现 input_range
概念,但它永远无法实现 input_range
本身。即使您在包装器中放入 contiguous_range
类型,包装器也会将接口限制为 input_range
.
的接口
因此,最好避免这种情况,并尽可能通过模板依赖静态多态性。
我正在编写一个 C++ 库,并且有一个 惊人的 想法,即尽可能多地使用 C++2a/C++20。因此,我正在使用标准库概念并创建自己的概念。然而,函数 returning a std::vector<X>
的想法对我来说似乎 non-C++20 就足够了,所以我在我的概念中声明了一个 return 类型匹配 std::ranges::view<X>
.然后,我实施了一些实现此概念的 classes。
然而,当我想设计一个多态包装器时,问题出现了class。所以,假设这个概念是 C
,我有三个实现 classes C1
、C2
和 C3
(但允许更多)。现在我想创建一个 class C_virtual
和一个从它派生的模板 C_virtual_impl<C c>
,这将允许我引用所有 class 实现 C
的多态性。然而,为了让它工作,我需要一个多态的 std::ranges::view
包装器,在精神上类似于 C_virtual
.
我在 headers 和 C++ 参考中没有看到任何这样的 class。此外,当我开始自己实现它时,由于对迭代器的某些要求,特别是默认可构造性、可交换性和类似的要求,我很快发现自己无法实现。
标准库或成语中是否有不明显的解决方案?如果没有,我该如何处理这个问题?可能改变设计会奏效。我当然不想 return a std::vector<X>
或 return a V<X>
其中 V
将是 C
的类型参数。我该怎么做?
范围视图和许多其他模板技术并不意味着与基于继承的多态性一起使用。这很像 vector<BaseClass>
不是特别有用。
如果你需要运行时多态,那么你要的工具不是继承(直接);这是类型擦除。也就是说,您有一些视图包装器,它使用类型擦除将各种视图操作转发到已擦除的类型。这还需要与包装给定视图的迭代器的类型擦除迭代器配对。
当然,这意味着视图的特性必须由类型擦除包装器定义。包装器可以实现 input_range
概念,但它永远无法实现 input_range
本身。即使您在包装器中放入 contiguous_range
类型,包装器也会将接口限制为 input_range
.
因此,最好避免这种情况,并尽可能通过模板依赖静态多态性。