유형 T와 구조체가 T 유형의 유일한 균일 한 요소 만 갖는 경우가 있습니다.배열 첨자 연산자를 사용하여 구조체 멤버에 액세스
struct Foo {
T one,
T two,
T three
};
나는 fallowing 방식으로 접근하고 싶습니다이 :
struct Foo {
T one,
T two,
T three
T &operator [] (int i)
{
return *(T*)((size_t)this + i * cpp_offsetof(Foo, two));
}
};
매크로 cpp_offsetof
가 (이 올바른 것으로 간주됩니다)입니다 : '
#define cpp_offsetof(s, m) (((size_t)&reinterpret_cast<const volatile char&>((((s*)(char*)8)->m))) - 8)
C++ 표준 아무튼 그것을 보장 할 수는 있지만, 멤버가 고정 된 오프셋으로 멀리 떨어져 있다고 가정 할 수 있으며 위에있는 것은 올바른 크로스 플랫폼 솔루션입니까?
100 % 호환 솔루션은 다음과 같습니다
struct Foo {
T one,
T two,
T three
T &operator [] (int i) {
const size_t offsets[] = { cpp_offsetof(Foo, one), cpp_offsetof(Foo, two), cpp_offsetof(Foo, three) };
return *(T*)((size_t)this + offsets[i]);
}
};
[편집] 표준을 준수하고 빠른 버전은snk_kid using pointers to data members[/ 편집]
제시하지만 추가 조회 테이블을 필요로 한 나는 피하려고 노력하고있어.
// 편집
그리고 또 하나. 나는 배열과 상수를 사용하여 이러한 필드를 인덱싱 할 수 없으며 구조체의 필드 이름을 지정해야합니다 (일부 매크로 필요).
// EDIT2
왜 구조체의 필드 이름을 지정해야합니까? 매크로는 무엇입니까? 더 큰 프로젝트의 설정 시스템입니다. 단순화는 다음과 같습니다.
struct Foo {
int one;
int two;
}
foo;
struct Setting { void *obj, size_t filed_offset, const char *name, FieldType type }
#define SETTING(CLASS, OBJ, FIELD, TYPE) { OBJ, cpp_offsetof(CLASS, FIELD), #OBJ #FIELD, TYPE }
Setting settings[] = {
SETTING(Foo, foo, one, INT_FIELD),
SETTING(Foo, foo, two, INT_FIELD)
};
그리고 다시 : 저는 100 % 호환 솔루션을 찾고 있지만 99 %는 아닙니다. 필자는 어떤 컴파일러가 균일 한 필드 사이에 비 균일 패딩을 배치 할 것으로 기대할 수 있는지 묻습니다.
OP와 관련이 없지만 offsetof 매크로가 8을 기본으로 사용하는 이유를 아는 사람이 있습니까? MSVC는 0을 사용하고, GCC는 내장 함수를 사용하며 심지어 0이 아닌 기반에 ICE 버그를 가지고 있습니다. –
대답이 있더라도, 나는이 질문에서 벗어나 모든 것이 어떻게 흐트러지고 있는지 보게 될 것입니다 ...: S (농담, 당연히) –
아니, 나는 그것을 직접 확인하고 있었다. 내 의견을 읽으십시오. 지금 나는 내 downwote를 취소했다. 내가 틀렸다는 것을 증명하지 않으면, downvote가있을 것입니다. 그리고 분명히하기 위해, 나는 테이블 룩업에 대한 해결책을 이미 알고 있다고 썼다. 그래서 나는 downvoted했다. – adf88