gpt4 book ai didi

c++ - 将枚举类模板限制为带标签的类型

转载 作者:行者123 更新时间:2023-12-04 08:04:04 31 4
gpt4 key购买 nike

我想用enum class <NAME>作为位掩码。我编写了以下概念,限制模板仅用于 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) ...

关于c++ - 将枚举类模板限制为带标签的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66307049/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com