C++ 将枚举类模板限制为带标签的类型
我想使用C++ 将枚举类模板限制为带标签的类型,c++,templates,enums,c++20,c++-concepts,C++,Templates,Enums,C++20,C++ Concepts,我想使用enum类作为位掩码。我编写了以下概念,限制模板仅用于枚举类: 模板 概念枚举= std::是_enum_v吗&& !std::可转换为; 现在使用此概念创建添加模板: 模板 内联常量表达式元素运算符+(元素lhs、元素rhs){ 使用T=std::底层类型; 返回静态施法(静态施法(lhs)|静态施法(rhs)); } 但这会污染所有使用位掩码运算符的enum类。当枚举类定义如下时,我想限制使用: 枚举类和枚举:位掩码{ }; 其中位掩码\u t是一个受限制的模板,如下所示: 模
enum类
作为位掩码。我编写了以下概念,限制模板仅用于枚举类:
模板
概念枚举=
std::是_enum_v吗&&
!std::可转换为;
现在使用此概念创建添加模板:
模板
内联常量表达式元素运算符+(元素lhs、元素rhs){
使用T=std::底层类型;
返回静态施法(静态施法(lhs)|静态施法(rhs));
}
但这会污染所有使用位掩码运算符的enum类。当枚举类定义如下时,我想限制使用:
枚举类和枚举:位掩码{
};
其中位掩码\u 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) ...
template-concept-Bitmask=requires(T){IsBitmask(T);};
模板T运算符+(T a,T b)。。。