是否可以 enable/disable 带有 `requires` 子句的纯虚函数?
Is it possible to enable/disable a pure virtual function with `requires` clause?
我有一个适配器 class 可以处理 class 个相同概念。
现在,我希望基于模板参数 RO
(只读)的适配器禁用 pack()
。但是不知道是纯虚拟机不支持还是我写错了
template<bool RO> // means read only functionality
class Adapter
{
struct AbstractAdapter
{
virtual ~AbstractAdapter() = default;
virtual void unpack() = 0;
virtual void pack() = 0 requires (!RO); // compile ERROR!! ERROR!! ERROR!!
};
template<typename T> requires (Reader<T> || Writer<T>)
struct TemplateAdapter : public AbstractAdapter
{
virtual void unpack()
{
if constexpr (!Reader<T>) throw UnsupportedOperationEx{};
else client.unpack();
}
virtual void pack() requires (!RO)
{
if constexpr (!Writer<T>) throw UnsupportedOperationEx{};
else client.pack();
}
T client;
};
public:
void unpack() { client->unpack(); }
void pack() requires(!RO) { client->pack(); }
private:
AbstractAdapter *client;
};
在 C++20 标准中,11.7.2 [class.virtual] 第 6 段说:
A virtual function shall not have a trailing requires-clause (9.3). *[Example:
struct A {
virtual void f() requires true;
// error: virtual function cannot be constrained (13.5.2)
};
— end example]
它更冗长,但您可以在 ReadOnly 和 ReadWrite 适配器层次结构之间使用 std::conditional
到 select。 (避免使用大写字母的多字符标识符 [带或不带 uniderscores)- 最佳实践将它们留给预处理器使用)。
我有一个适配器 class 可以处理 class 个相同概念。
现在,我希望基于模板参数 RO
(只读)的适配器禁用 pack()
。但是不知道是纯虚拟机不支持还是我写错了
template<bool RO> // means read only functionality
class Adapter
{
struct AbstractAdapter
{
virtual ~AbstractAdapter() = default;
virtual void unpack() = 0;
virtual void pack() = 0 requires (!RO); // compile ERROR!! ERROR!! ERROR!!
};
template<typename T> requires (Reader<T> || Writer<T>)
struct TemplateAdapter : public AbstractAdapter
{
virtual void unpack()
{
if constexpr (!Reader<T>) throw UnsupportedOperationEx{};
else client.unpack();
}
virtual void pack() requires (!RO)
{
if constexpr (!Writer<T>) throw UnsupportedOperationEx{};
else client.pack();
}
T client;
};
public:
void unpack() { client->unpack(); }
void pack() requires(!RO) { client->pack(); }
private:
AbstractAdapter *client;
};
在 C++20 标准中,11.7.2 [class.virtual] 第 6 段说:
A virtual function shall not have a trailing requires-clause (9.3). *[Example:
struct A {
virtual void f() requires true;
// error: virtual function cannot be constrained (13.5.2)
};
— end example]
它更冗长,但您可以在 ReadOnly 和 ReadWrite 适配器层次结构之间使用 std::conditional
到 select。 (避免使用大写字母的多字符标识符 [带或不带 uniderscores)- 最佳实践将它们留给预处理器使用)。