gpt4 book ai didi

c++ - 如何类型删除 C++ 概念

转载 作者:太空狗 更新时间:2023-10-29 22:54:10 26 4
gpt4 key购买 nike

我正在尝试实现一个小型网络库来学习概念,并且我正在尝试找到一种方法来定义简洁的概念,而不必在相关概念上携带模板参数。例如,我有以下概念:

template <typename ValueT>
concept bool Value = true;

template <typename BufferT>
concept bool Buffer = requires(BufferT buf)
{
{ buf.Size() } -> std::size_t;
{ buf.Capacity() } -> std::size_t;
{ buf.Put(Value</* How can I resolve this to any value */>) } -> bool;
{ buf.Take(Value</* How can I resolve this to any value */>) } -> bool;
};

template <typename ReadableT>
concept bool Readable = requires(ReadableT r)
{
{ r.Read(Buffer</* How can I resolve this to any buffer */>) } -> void;
};

template <typename WritableT>
concept bool Writable = requires(WritableT w)
{
{ w.Write(Buffer</* How can I resolve this to any buffer */>) } -> void;
};

template <typename ChannelT>
concept bool Channel = requires(ChannelT chan)
{
requires Readable<ChannelT>;
requires Writable<ChannelT>;
};

如何定义 ValueBuffer 概念,而不必显式具有模板参数?有可能吗?我会直觉地这样写:

template <typename ReadableT>
concept bool Readable = requires(ReadableT r)
{
template <typename ValueT>
{ r.Read(Buffer<ValueT>) } -> void;
};

但这并没有编译(显然),我想不出正确的语法。

编辑:我觉得正确的语法是这样的:

template <typename BufferT>
concept bool Buffer = requires(BufferT buf, Value val)
{
{ buf.Size() } -> std::size_t;
{ buf.Capacity() } -> std::size_t;
{ buf.Put(val) } -> bool;
{ buf.Take(val) } -> bool;
};

但是 GCC (8.3.0) 打印出这条消息:

internal compiler error: in synthesize_implicit_template_parm, at cp/parser.c:39141
concept bool Buffer = requires(BufferT buf, Value val)
^~~~~
Please submit a full bug report, with preprocessed source if appropriate.

最佳答案

the idea is that I should be able to put any struct, or an integer or a string, or anything really in a buffer

这不是一个概念能够回答的问题。也不是故意的。

概念是用来约束模板的。在某种程度上,模板应该知道它在做什么。特定的模板实例化不适用于“任何结构、整数或字符串”;它适用于特定类型,由其模板参数和依赖于它们的表达式定义。概念也是如此。

所以考虑这样一个模板:

template<typename Buff, typename Iterator>
void InsertIntoBuffer(Buff &buf, Iterator beg, Iterator ed)
{
for(; beg != ed; ++beg)
buf.Put(*beg);
}

这个函数想要对 Buff 施加的约束是“有一个可以接受任何对象的Put 函数。”实际约束是“有一个 Put 函数,它可以接受 Iteratoroperator* 返回的内容。”

所以“放”和“取”不仅仅是对Buff的约束;它还需要知道正在“放”或“取”什么。

换句话说,不是类型有约束;受约束的是操作作为一个整体。

因此您将对 Buffer 有一个基本约束,这是一个有大小和容量的东西。但是您还应该有一个 PutBuffer 约束,它强加了 Buffer 可以 Put 给定类型的要求。

类似地,Readable 实际上是一个 ReadableFromBuffer,其中提供了缓冲区类型。

关于c++ - 如何类型删除 C++ 概念,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57029449/

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