2014-07-22 18 views
0

我正在玩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,可以使用什麼來編譯方法。

編輯:

謝謝你的狗狗的答案!它正是我想要的!

回答

0

特別是當您嘗試使用std :: enable_if時遇到什麼問題?

編輯:

爲了確定是否base_policy類應該具有創建在編譯時定義/寫/讀(使用模板),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(); 
+0

我真的很喜歡這個!我只是不知道這是否適合我的想法。因爲mem1和mem2具有讀取,寫入和rw訪問權限。因此,如果策略具有寫入權限,則mem1仍然需要寫入方法。這就是爲什麼我在考慮enable_if write()。我很抱歉,如果我很困惑:/ – user3749332

+0

對不起,我沒有注意到你最高的問題。我得到一個錯誤,說「錯誤:模板參數的模板類型參數必須是一個類型」所以我認爲這是因爲訪問類型是枚舉類。 – user3749332

+0

沒關係,我編輯了這個問題。我想我明白你想要什麼。這是你的根本問題:如果你想在編譯時根據訪問類型在base_policy定義中包含或排除創建/寫入/讀取函數定義,那麼訪問類型必須是編譯時常量。目前,在mem1_access和mem2_access結構中,m(訪問類型)不是常量。我會更新我的答案,向你展示我的意思。 –