저는 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에 따라 메소드 만 컴파일하는 데 사용할 수있는 것은 무엇입니까?
편집 :
답장을 보내 주셔서 감사합니다. 그것은 내가 원했던 바로 그 일을합니다!
나는 정말로 이것을 좋아한다! 이 아이디어가 나에게 도움이 될지 모르겠다. mem1과 mem2는 읽기, 쓰기 및 rw 액세스 권한을 가지고 있기 때문입니다. 따라서 정책에 쓰기 액세스 권한이있는 경우 mem1에 쓰기 메소드가 필요합니다. 그래서 나는 enable_if write()를 생각하고있었습니다. 혼란 스럽다면 미안합니다./ –
user3749332
죄송합니다. 귀하의 가장 중요한 질문을 알지 못했습니다. "오류 : 템플리트 유형 매개 변수에 대한 템플리트 인수가 유형이어야합니다"라는 오류가 발생했습니다. 따라서 액세스 유형이 enum 클래스 였기 때문에 오류가 있다고 가정했습니다. – user3749332
괜찮습니다. 그 질문을 편집했습니다. 지금 내가 원하는 것을 이해하고 있다고 생각합니다. 근본적인 문제는 다음과 같습니다. 액세스 유형에 따라 컴파일 타임에 base_policy 정의에서 작성/기록/읽기 함수 정의를 포함 시키거나 제외하려는 경우 액세스 유형은 컴파일시 상수 여야합니다. 현재 mem1_access 및 mem2_access 구조체에서 m (액세스 유형)은 상수가 아닙니다. 내 대답을 업데이트하여 내가 의미하는 바를 알려줄 것입니다. –