2014-07-22 3 views
0

저는 C++을 가지고 놀고있어 템플릿, 열거 형 클래스 등을 사용해 보았습니다. 저의 고민 거리에서 저는 그것을 풀 수있는 좋은 방법이 있는지 확신 할 수없는 문제에 직면했습니다. mem1과 mem2의 두 가지 유형의 "메모리"가 있습니다. 이 두 가지 모두에 액세스하는 방법에 대한 특별 정책이 있지만 동일한 방법 (예 : 작성, 읽기, & 작성)이 있습니다. 이제 메모리의 액세스 유형에 따라 컴파일러에서 액세스 유형이 읽기 전용이고 해당 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) {}; 
}; 

내가 쓰기에 대한 표준 : 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(); 
}; 

을 아니면 내가 생각하는 표준 : 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

죄송합니다. 귀하의 가장 중요한 질문을 알지 못했습니다. "오류 : 템플리트 유형 매개 변수에 대한 템플리트 인수가 유형이어야합니다"라는 오류가 발생했습니다. 따라서 액세스 유형이 enum 클래스 였기 때문에 오류가 있다고 가정했습니다. – user3749332

+0

괜찮습니다. 그 질문을 편집했습니다. 지금 내가 원하는 것을 이해하고 있다고 생각합니다. 근본적인 문제는 다음과 같습니다. 액세스 유형에 따라 컴파일 타임에 base_policy 정의에서 작성/기록/읽기 함수 정의를 포함 시키거나 제외하려는 경우 액세스 유형은 컴파일시 상수 여야합니다. 현재 mem1_access 및 mem2_access 구조체에서 m (액세스 유형)은 상수가 아닙니다. 내 대답을 업데이트하여 내가 의미하는 바를 알려줄 것입니다. –