是否可以使用“requires”子句启用/禁用纯虚函数?

Cha*_*eon 4 c++ pure-virtual c++-concepts

我有一个适配器类,它处理相同概念的类。

现在,我希望该适配器基于模板参数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;
};
Run Code Online (Sandbox Code Playgroud)

Ton*_*roy 6

在 C++20 标准中,11.7.2 [class.virtual] 第 6 段说:

\n
\n

虚函数不应有尾随的require 子句(9.3)。*[例子:

\n
\n
struct A {\n    virtual void f() requires true;\n         // error: virtual function cannot be constrained (13.5.2)\n};\n
Run Code Online (Sandbox Code Playgroud)\n
\n

\xe2\x80\x94结束示例]

\n
\n

它更详细,但您可以使用std::conditional在 ReadOnly 和 ReadWrite 适配器层次结构之间进行选择。(避免使用大写字母[带或不带uniderscores]的多字符标识符 - 最佳实践将它们留给预处理器使用)。

\n