【发布时间】: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