使用概念用不同的概念定义同一个类

yi *_*uce 2 c++ templates concept

我想创建模板类来获取具有相同类的引用类型和非引用类型模板类,如下所示

\n
    template <typename T> requires (std::is_reference_v<T>)\n    struct RRR\n    {\n        T m_value{};\n        RRR(T init) : m_value{ init }\n        {}\n    };\n\n    template <typename T> requires (!std::is_reference_v<T>)\n    struct RRR\n    {\n        T m_value{};\n        RRR(T init) : m_value{ init }\n        {}\n    };\n
Run Code Online (Sandbox Code Playgroud)\n

但是当我使用它时,我遇到了下面的编译错误。

\n

错误:重新声明 \xe2\x80\x98template 需要具有不同约束的 is_reference_v struct RRR\xe2\x80\x99

\n

像这种情况定义模板的解决方案是什么?

\n

Art*_*yer 6

使它们部分专业化:

    template <typename T>
    struct RRR;

    template <typename T> requires (std::is_reference_v<T>)
    struct RRR<T>
    {
        T m_value{};
        RRR(T init) : m_value{ init }
        {}
    };

    template <typename T> requires (!std::is_reference_v<T>)
    struct RRR<T>
    {
        T m_value{};
        RRR(T init) : m_value{ init }
        {}
    };
Run Code Online (Sandbox Code Playgroud)

您甚至可以将其中一个作为部分专业化,另一个作为主要模板:

    template <typename T>
    struct RRR
    {
        T m_value{};
        RRR(T init) : m_value{ init }
        {}
    };

    // This one will be used for references since it is more constrained
    template <typename T> requires (std::is_reference_v<T>)
    struct RRR<T>
    {
        T m_value{};
        RRR(T init) : m_value{ init }
        {}
    };

Run Code Online (Sandbox Code Playgroud)

  • @yibruce:如果这回答了您的问题,您可以选择接受它(绿色复选标记)。 (3认同)