Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将枚举类模板限制为带标签的类型_C++_Templates_Enums_C++20_C++ Concepts - Fatal编程技术网

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)。。。