gpt4 book ai didi

需要以 OutputIterator 作为参数的成员函数的 C++ 概念

转载 作者:行者123 更新时间:2023-12-01 14:39:31 25 4
gpt4 key购买 nike

我正在玩概念并遇到障碍。或者也许只是我的思想被阻塞了。

我想创建一个缓冲“批量可读”数据源的类。这样的数据源应该有一个成员函数,该函数接受一个 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){}
...

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

最佳答案

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

有了概念,你从另一个方向处理问题:你试图创造什么用途?

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

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

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

所以这里是选项:

  • 用户给接口(interface)一个迭代器类型(直接或间接)。如果是这种情况,那么您只需在函数的 BulkReadable 中使用该类型即可。约束。如果迭代器类型基于对参数的一组复杂操作,那么您必须进行一些计算来计算迭代器类型。
  • 迭代器是静态确定的。然后只需在约束中使用已知的迭代器类型。

  • 关键是,在您尝试调用 read 的时候,你知道迭代器类型是什么。因此,您可以使用该类型约束事物。因此,您的概念并不是真正的 BulkReadable , 但是 BulkReadableFrom .

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

    关于需要以 OutputIterator 作为参数的成员函数的 C++ 概念,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61443027/

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