[英]Enum class with enable_if methods
我在玩C ++,嘗試了模板,枚舉類等。 在我的涉獵中,我遇到了一個不確定解決問題的好方法的問題。 我有兩種不同類型的“內存”:mem1和mem2。 兩者都有關於如何訪問它們的特殊策略,但是具有相同的方法:創建,讀取和寫入。 現在,根據內存的訪問類型,我希望編譯器給我一個錯誤,例如,如果訪問類型為只讀且其調用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用於檢查所提供訪問的訪問類型的write和read方法。 但我只是想不出該怎么做。 根據提供的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();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.