我正在尝试使用 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/