将枚举 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 class
es。当枚举 类 定义如下时,我想限制使用:
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) ...
我想使用 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 class
es。当枚举 类 定义如下时,我想限制使用:
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) ...