일반적으로 operator[]의 경우 레퍼런스 타입으로 사용을 하지만..
이번 경우처럼 비트필드에서는 레퍼런스나 포인터를 사용할 수 없습니다.
기초 님이 쓰신 글 :
: C++기초네요
:
: int & operator[](int idx);
:
: 위와같이 레퍼런스타입으로 해야함
:
:
:
: 빌더초보 님이 쓰신 글 :
: : 어떤 어플에서 주로 사용 하는 데이터 형이 short 형인데,
: : 대입하는 수의 범위가 0 ~ 4095 까지 입니다.
: : 즉 16 비트 중, 12 비트만을 사용하며, 4비트를 낭비하고 있죠.
: :
: : 뭐 4비트 차이야 문제가 없지 않냐 할수 있겠지만 저장 하는 용량 자체가 무시 하지 못 할 수준입니다.
: : 많으면 약 400 기가 정도... 12비트만 사용 한다면 무려 100 기가가 줄어 듭니다.
: :
: : 그래서...
: : 비트 필드를 사용하고,
: : 4byte 단위로 만들기 위해 int 형 8개를 묶는 방법을 생각 했습니다.
: : 사용 편의를 위해 [] 연산자 오버로딩도 했고요.
: :
: :
: :
: : #pragma pack(1)
: : struct int12x8 {
: : int v0 : 12;
: : int v1 : 12;
: : int v2 : 12;
: : int v3 : 12;
: : int v4 : 12;
: : int v5 : 12;
: : int v6 : 12;
: : int v7 : 12;
: :
: : int operator[](int idx) {
: : if (idx == 0) {
: : return v0;
: : }else if (idx == 1) {
: : return v1;
: : }else if (idx == 2) {
: : return v2;
: : }else if (idx == 3) {
: : return v3;
: : }else if (idx == 4) {
: : return v4;
: : }else if (idx == 5) {
: : return v5;
: : }else if (idx == 6) {
: : return v6;
: : }else {
: : return v7;
: : }
: : }
: : };
: : #pragma pack()
: :
: :
: :
: : 12 바이트로 정상적으로 저장 불러오기 잘 되는것 까지 확인 했는데
: :
: : 문제는, [] 연산자로 호출(get)은 되는데, 대입(set)이 안되더군요.
: :
: :
: :
: : int12x8 tmp ;
: :
: : tmp.v0 = 1;
: :
: : ShowMessage(tmp[0]); // 정상
: :
: : tmp[0]=1; // 애러
: :
: :
: : 위 구조체를
: :
: : tmp[0]=값;
: :
: : 처럼 쓸수 있는 방법이 없을까요?
: :
: :
: :
: : __property int v[int i] = {read = GetValue , write = SetValue};
: :
: : 이 처럼 프로퍼티를 하나 선언 하면,
: :
: : tmp.v[0]=1;
: : 형태로 사용 가능 하긴 한데, 영... 내키지가 않더군요...
: :
: :
: : 또 한,
: : = 연산자를 오버로딩 하려고 했지만, "인수가 한 개만 있어야 한다"는 애러가 뜹니다.
: :
: :
: : 질문을 요약 하자면...
: : 여러개의 변수를 묶은 비트필드 구조체에서
: : 각 변수에 배열처럼 접근할 수 있는 방법이 있나요?
: :
: :
: : 좋은 조언 부탁 드립니다.