将枚举 class 模板限制为标记类型

Restricting an enum class template to a labeled type

我想使用 enum class <NAME> 作为位掩码。我写了以下概念,限制 only Enum 类:

模板的使用
template <class E>
concept Enumeration =
    std::is_enum_v<E> &&
    !std::convertible_to<E, std::underlying_type<E>>;

现在使用这个概念制作一个添加模板:

template <Enumeration Element>
inline constexpr Element operator + (Element lhs, Element rhs) {
    using T = std::underlying_type_t<Element>;
    return static_cast<Element>(static_cast<T>(lhs) | static_cast<T>(rhs));
}

但这会污染所有带有位掩码运算符的 enum classes。当枚举 类 定义如下时,我想限制使用:

enum class An_Enum : Bitmask_t<std::size_t> {
};

其中 Bitmask_t 是这样的受限模板:

template <class T>
concept Bitmask_t = std::integral<T>;

如何在我的枚举概念中强制执行此限制?有没有更好的方法来实现这个模板约束?

您可以通过多种方式使用任意标签来标记任意类型。这是一个视觉上令人愉悦的:

using Conceptually = void;

enum class MyBitmask : ...;
Conceptually IsBitmask(MyBitmask);     // no need to define the function

enum class NotABitmask : ...;
// nothing

然后在模板中使用它:

template <typename T> concept Bitmask = requires(T t) { IsBitmask(t); }; 

template <Bitmask T> T operator+(T a, T b) ...