具有enable_if方法的枚举类
Enum class with enable_if methods
我在c++中玩了一会儿,尝试了模板、枚举类等。在我的涉猎中,我遇到了一个问题,我不确定解决它的好方法。我有两种不同类型的"内存":mem1和mem2。它们都有特殊的访问策略,但方法相同:create, read, &写。现在,根据内存的访问类型,我希望编译器给我一个错误,例如,访问类型是只读的,它调用write()。以下是目前为止的内容:
enum class mem1_access_type : int { write = 0, read = 1, rw = 2 };
enum class mem2_access_type : int { write = 3, read = 4, rw = 5 };
struct mem1_access
{
mem1_access() : m(mem1_access_type::rw), p(0);
mem1_access(mem1_access_type _m) : m(_m), p(0);
mem1_access_type getAccess(){ return m; };
int getP(){ return p; };
private:
mem1_access_type m;
int p;
};
struct mem2_access
{
mem2_access() : m(mem2_access_type::rw), p(0);
mem2_access(mem2_access_type _m) : m(_m), p(0);
mem2_access_type getAccess(){ return m; };
int getP(){ return p; };
private:
mem2_access_type m;
int p;
};
template <typename Access>
struct base_policy
{
Access a;
base_policy(Access _a) : a(_a) {};
void create();
//HERE
void write();
//AND HERE
void read();
};
struct mem1_policy : base_policy<mem1_access>
{
mem1_policy(mem1_access _a) : base_policy<mem1_access>(_a) {};
};
struct mem2_policy : base_policy<mem2_access>
{
mem2_policy(mem2_access _a) : base_policy<mem2_access>(_a) {};
};
我正在考虑使用std::enable_if作为检查所提供访问的访问类型的写和读方法。但我就是想不出该怎么做。根据提供的access_type只能编译方法。
编辑:谢谢琼斯狗的回答!它的功能完全符合我的要求!
当您尝试使用std::enable_if时,您遇到了什么问题?
编辑:为了确定base_policy类是否应该在编译时(使用模板)定义create/write/read, mem1_access和mem2_access的访问类型必须是编译时常量:template <mem1_access_type accessType> struct mem1_access
{
// These typedefs will help 'store' the read/write access information for later:
typedef mem1_access_type AccessType;
typedef std::integral_constant<mem1_access_type, accessType> AccessValue;
mem1_access() : p(0) {}
mem1_access_type getAccess(){ return m; };
int getP(){ return p; };
static const mem1_access_type m = accessType;
private:
int p;
};
template <mem2_access_type accessType> struct mem2_access
{
typedef mem2_access_type AccessType;
typedef std::integral_constant<mem2_access_type, accessType> AccessValue;
mem2_access() : p(0) {}
mem2_access_type getAccess(){ return m; };
int getP(){ return p; };
static const mem2_access_type m = accessType;
private:
int p;
};
注意,您不能再在构造函数中设置访问类型。它现在是一个模板参数,一个编译时常数。你愿意做这个交易吗?
之后,在base_policy中,您可以指定默认模板参数,然后对它们进行专门化:
// Be default, this class can write():
template <typename Access, bool shouldWrite=Access::AccessType::write == Access::m || Access::AccessType::rw == Access::m>
struct base_policy
{
Access a;
base_policy(Access _a) : a(_a) {};
void create();
//HERE
void write();
//AND HERE
void read();
};
// This class can't write():
template <typename Access>
struct base_policy<Access, false>
{
Access a;
base_policy(Access _a) : a(_a) {};
void create();
//HERE
//AND HERE
void read();
};
或者使用std::enable_if,我认为应该像这样(在base_policy的主体中):
std::enable_if<Access::AccessType::write == Access::m || Access::AccessType::rw == Access::m, void>::type write();
相关文章:
- 枚举环境变量的惯用C++14/C++17方法
- 枚举元组类型的最佳方法?
- 基于枚举参数调用专用模板方法
- 替换枚举以最大化编译时间检查的最佳方法
- 将枚举与 CMake 链接的正确方法是什么?
- 为什么方法重载或枚举标志定义会触发 gcc7.2 编译器警告?
- 如何将枚举传递给方法而不将其作为整数传递
- 我的私有方法如何在C++中访问公共枚举
- 枚举器 C++ 的 setter 和 getter 方法
- 一种创建将字符串常量返回给枚举的类的廉价方法,反之亦然
- 有没有一种方法可以在基于枚举的可变参数模板函数之间进行选择,这比将函数包装在结构中更简单
- 如何定义在外部类之外返回枚举黑客的嵌入式类的方法?
- 是否有一种有效的,适当的方法将非常大的公共班级枚举放在利用它们的公共方法之下,以使代码更加干净
- 具有枚举类型类型的C 方法
- 是否可以定义一个宏来定义枚举类和返回枚举元素计数的 GetCount() 方法
- 将枚举转换为值的正确方法
- 在 .NET 中调用 COM 枚举器的正确方法是什么?
- 使用 Doxygen 或类似方法记录枚举标志
- 虚拟方法返回代表派生对象类型的枚举 - 是否可以(在设计方面)
- C 枚举类可以使用方法