簡體   English   中英

帶有enable_if方法的枚舉類

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM