我正在玩C++,嘗試使用模板,枚舉類等。在我的涉獵中,我遇到了一個問題,我不確定是否有解決問題的好方法。我有兩種不同類型的「內存」:mem1和mem2。這兩者都有關於如何訪問它們的特殊策略,但方法相同:create,read,& write。現在,取決於內存的訪問類型,例如,如果訪問類型是隻讀的並且其調用write(),我希望編譯器給我一個錯誤。這是我到目前爲止有:使用enable_if方法的Enum類
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,可以使用什麼來編譯方法。
編輯:
謝謝你的狗狗的答案!它正是我想要的!
我真的很喜歡這個!我只是不知道這是否適合我的想法。因爲mem1和mem2具有讀取,寫入和rw訪問權限。因此,如果策略具有寫入權限,則mem1仍然需要寫入方法。這就是爲什麼我在考慮enable_if write()。我很抱歉,如果我很困惑:/ –
user3749332
對不起,我沒有注意到你最高的問題。我得到一個錯誤,說「錯誤:模板參數的模板類型參數必須是一個類型」所以我認爲這是因爲訪問類型是枚舉類。 – user3749332
沒關係,我編輯了這個問題。我想我明白你想要什麼。這是你的根本問題:如果你想在編譯時根據訪問類型在base_policy定義中包含或排除創建/寫入/讀取函數定義,那麼訪問類型必須是編譯時常量。目前,在mem1_access和mem2_access結構中,m(訪問類型)不是常量。我會更新我的答案,向你展示我的意思。 –