c++ - 如何使用概念在 C++ 20 中提供默认实现?

标签 c++ oop interface c++20 c++-concepts

我正在尝试使用 concept 的可能性s 在 C++20 中作为静态接口(interface)引入。到目前为止,我做得很好,只是我无法找到一种方法来为概念提供“默认实现”。
例如,我有一个名为 ByteBuffer 的概念。 ,它是这样表述的:

template <typename T>
concept ByteBuffer = requires (T t) {
  { t.read_byte() } noexcept -> std::convertible_to<uint8_t>;
  { t.has_byte() } noexcept -> std::same_as<bool>;

  /* default implementation for `t.read_until(...)`? */
};
从逻辑上讲,我应该能够为 t.read_until(...) 提供默认实现。 (省略参数),并允许具体实现覆盖默认实现。有办法吗?我该怎么做?
如果这是不可能的,我认为添加这样的能力是合理的。
目前,我不得不求助于 CRTP 来提供一个外观类,我认为它比我想象的要多余。

最佳答案

概念不是基类。事实上,概念与它们的任何模板参数都没有明确或隐含的关系。
概念只做一件事:验证特定模板参数集是否适合在实例化特定模板时使用。就这样。
概念包含一系列表达式和术语,它们应该对给定的模板参数有效。这就是确定一组模板参数是否对特定用途有效所需的全部内容,这就是所有概念所提供的。
如果您需要某种默认功能,则必须使用替代的 C++ 机制来做到这一点。最简单的是具有自身约束的效用函数:

template<typename T>
concept ByteBufferReadUntil = ByteBuffer<T> &&
  requires(T bb) //Add parameters as appropriate
  {
    { t.read_until() } noexcept -> std::same_as<bool>;
  };

template<ByteBuffer T>
  requires ByteBufferReadUntil<T>
bool read_byte_buffer_until(T &bb)
{
  return t.read_until();
}

template<ByteBuffer T>
bool read_byte_buffer_until(T &bb)
{
  //default implementation for `t.read_until(...)`
}
所以每当你想做read_until对于任意 ByteBuffer ,您调用read_byte_buffer_until .

关于c++ - 如何使用概念在 C++ 20 中提供默认实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63046619/

相关文章:

c++ - 与 HID 交谈

c++ - 多字符持续警告

java - 接口(interface)的默认实现?或保留为空

c++ - dllexport 函数未导出

c++ - 如何在单独的头文件中处理相互依赖的类?

c++ - 如何从派生类函数调用父类函数?

oop - 阿空加瓜 : Base Units - would equality comparison be better than identity?

c# - 从标准小部件继承并在 C# 中设置我自己的默认值是个好主意吗?

没有实现的java接口(interface)

mongodb http接口(interface)认证