【问题标题】:C++ Concept that requires a member function with an OutputIterator as parameter需要以 OutputIterator 作为参数的成员函数的 C++ 概念
【发布时间】:2020-08-10 01:44:06
【问题描述】:

我在玩概念,遇到了障碍。也可能只是我的思想被阻塞了。

我想创建一个缓冲“批量可读”数据源的类。这样的数据源应该有一个成员函数,该函数接受一个 OutputIterator 并具有如下签名:

template<typename It>
size_t read(It firstItem, size_t max)

我的想法是定义一个BulkReadable 概念,类似于:

template<typename Source>
concept bool BulkReadable = 
    requires(Source s, Iter out, size_t max) {
        {s.read(out, max)} -> size_t;
    };

我无法指定Iter。我可以在模板参数列表中添加另一个类型名,但是想要使用该概念的 Buffer 类需要指定该参数的类型。

我想使用这个概念的理想方式是:

template<BulkReadable Source>
class Buffer {
  public: 
    Source& input:
    Buffer(Source& input) : input(input){}
    ...     

这种方法是否可行?如果是,如果我不想/可以指定类型,我如何要求模板化方法签名?

【问题讨论】:

  • "这样的数据源应该有一个接受 OutputIterator 的成员函数" OutputIterators 是你写入的东西。名为“read”和“OutputIterator”的函数不能一起工作。此外,C++20 的范围使用迭代器/哨兵范式来定义范围;使用迭代器/大小是非标准的,应该避免。
  • 感谢您在下面提供信息丰富的答案!请原谅延迟的回复。 read() 方法应该从源读取到 OutputIterator。我想要类似于std::istream::read 但具有更通用界面的东西。但我同意这不是一种现代方法。

标签: c++ c++20 c++-concepts


【解决方案1】:

这是一个常见的问题,即提出错误的概念问题,您试图像使用基类接口一样使用它们。使用基类,您可以声明派生类要实现的确切、特定的功能。您希望用户完全实现您说他们必须的功能。

通过概念,您从另一个方向解决问题:您试图创建什么用法

在您的代码中,您有一些对象、一些迭代器和一个大小。您将获取该对象,通过将迭代器和大小传递给它来调用函数,并且您期望返回某种类型的响应。而这个过程是有一定意义的。

那么就是你的概念。这是一个基于至少 2 个参数的概念:对象的类型和迭代器类型。所以这就是你应该创建的。

如果你有这个BulkReadable 约束,那么你必须有一些接口约束它。将调用read 的接口。要调用read,该接口必须有一个迭代器。

以下是选项:

  1. 用户给接口一个迭代器类型(直接或间接)。如果是这种情况,那么您只需在函数的 BulkReadable 约束中使用该类型。如果迭代器类型基于对参数的一组复杂操作,那么您将不得不进行一些计算来计算迭代器类型。

  2. 迭代器是静态确定的。然后在约束中使用已知的迭代器类型。

关键在于,在您尝试调用read 时,您知道迭代器类型是什么。因此,您可以使用该类型约束事物。因此,您的概念实际上不是BulkReadable,而是BulkReadableFrom

简而言之,您不应该将类型限制为能够采用任何类型(或某些约束范围内的任何类型)。根据您要使用它们的实际类型检查约束,最好是在它们变得相关时。

【讨论】:

  • 我尝试了方法(1),将迭代器类型添加到BulkReadable,我失败的是迭代器的规范。我尝试像s.read(make_move_iterator(vec.begin()) 一样使用它,但无法指定迭代器的确切类型。也许我需要更深入地研究 C++ 迭代器机制。现在,我使用有效的选项(2)。当我完成指定和约束将使用我的库的应用程序域时,也许我会恢复到“基类”解决方案。我对BulkReadable 概念的意图是删除对基类的显式依赖。
猜你喜欢
  • 2016-10-05
  • 1970-01-01
  • 2012-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-10
相关资源
最近更新 更多