Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;一个概念,它需要一个成员函数,其参数为OutputIterator_C++_C++20_C++ Concepts - Fatal编程技术网

C++ C++;一个概念,它需要一个成员函数,其参数为OutputIterator

C++ C++;一个概念,它需要一个成员函数,其参数为OutputIterator,c++,c++20,c++-concepts,C++,C++20,C++ Concepts,我在玩概念游戏,遇到了障碍。也许只是我的思维被阻塞了 我想创建一个缓冲“大容量可读”数据源的类。这样的数据源应该有一个成员函数,该函数接受outputierator并具有如下签名: 模板 读取大小(第一项,最大大小) 我的想法是定义一个类似于以下内容的BulkReadable概念: 模板 概念布尔值= 需要(源s、Iter输出、最大尺寸){ {s.read(out,max)}->size\u t; }; 我在指定Iter时遇到问题。我可以向模板参数列表中添加另一个typename,但是想要使

我在玩概念游戏,遇到了障碍。也许只是我的思维被阻塞了

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

模板
读取大小(第一项,最大大小)
我的想法是定义一个类似于以下内容的
BulkReadable
概念:

模板
概念布尔值=
需要(源s、Iter输出、最大尺寸){
{s.read(out,max)}->size\u t;
};
我在指定Iter时遇到问题。我可以向模板参数列表中添加另一个typename,但是想要使用该概念的缓冲区类需要指定该参数的类型

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

模板
类缓冲区{
公众:
来源和输入:
缓冲区(源和输入):输入(输入){}
...     

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

这是一个常见的问题,提出了一个错误的概念问题,您试图像使用基类接口一样使用它们。对于基类,您声明了de要实现的是RIVE类。您希望用户完全实现您所说的必须实现的功能

通过概念,您可以从另一个方向来处理问题:您试图创造什么用途

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

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

如果您有此
BulkReadable
约束,则必须在其上约束某些接口。要调用
read
的接口。要调用
read
,该接口必须具有迭代器

因此,以下是选项:

  • 用户(直接或间接)为接口提供了一个迭代器类型。如果是这种情况,则只需在函数的
    BulkReadable
    约束中使用该类型。如果迭代器类型基于对参数的一组复杂操作,则必须进行一些计算来计算迭代器类型

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

  • 要点是,在您尝试调用
    read
    时,您知道迭代器类型是什么。因此,您可以使用该类型约束内容。因此,您的概念不是真正的
    BulkReadable
    ,而是
    BulkReadableFrom


    简言之,您不应将类型限制为能够接受任何类型(或某些约束内的任何类型)。请对照要使用的实际类型检查约束,最好是在它们变得相关时检查约束。

    “此类数据源应具有接受Outputierator的成员函数。”输出迭代器是您编写的对象。名为“
    read
    ”和“OutputIterator”的函数不能一起工作。此外,C++20的范围使用迭代器/sentinel范例来定义范围;使用迭代器/size是非标准的,应该避免使用。感谢您提供了下面的信息性答案!请原谅延迟响应。
    read()
    方法应该从源代码读取到输出迭代器。我想要类似于
    std::istream::read
    的东西,但是有一个更通用的接口。但是我同意这不是一个很现代的方法。我尝试了方法(1)通过将迭代器类型添加到<代码>可读取的中,我在这里失败的是迭代器的规范。我尝试使用它,如<代码> S.Read(MaxuMoViEthIdActualAdvor)(VC.OngEnter)(/Cordy>),但不能指定迭代器的确切类型。也许我需要深入深入C++迭代机制。现在,我使用选项(2)。这是可行的。当我完成指定和约束我的库将在其中使用的应用程序域时,也许我会回到“基类”解决方案。我使用
    BulkReadable
    概念的目的是删除对基类的显式依赖。