음 ... C++ 11에서는 일반 C++ 기능 (즉, 특정 컴파일러 내장 함수에 위임하지 않고)을 통해 이러한 오프셋을 실제로 계산할 수 있습니다. liveworkspace 행동에
:
template <typename T, typename U>
constexpr int func(T const& t, U T::* a) {
return (char const*)&t - (char const*)&(t.*a);
}
그러나이 t
은 모든 클래스에 적용되지 않을 수도 여기 constexpr
인스턴스에 대한 참조 인에 의존한다. 생성자 인 한 virtual
메서드를 사용하면 T
이 생성되지 않으며 생성자도 생성 할 수 없습니다.
그래도 이것은 상당히 방해가됩니다. 평가되지 않은 상황에서는 실제로는 std::declval<T>()
을 사용하여 객체를 시뮬레이션 할 수 있습니다. 없음. 따라서 객체의 생성자에 대한 특별한 요구 사항이 없습니다. 다른 한편으로, 우리가 그런 맥락에서 추출 할 수있는 가치는 거의 없다 ... 그리고 그들은 현재의 컴파일러에 대해서도 문제를 제기한다. 자, 가짜로 만들자! 행동
liveworkspace에서 :
template <typename T, typename U>
constexpr size_t offsetof_impl(T const* t, U T::* a) {
return (char const*)t - (char const*)&(t->*a) >= 0 ?
(char const*)t - (char const*)&(t->*a) :
(char const*)&(t->*a) - (char const*)t;
}
#define offsetof(Type_, Attr_) \
offsetof_impl((Type_ const*)nullptr, &Type_::Attr_)
내가 예견 유일한 문제는 기본 오브젝트의 그것의 실행 위치의, virtual
상속입니다. 나는 다른 결함이 있다면 기꺼이 받게 될 것입니다.
"반원들의 상쇄"란 정확히 무엇을 의미합니까? 멤버에게 전달하기 위해 클래스의 인스턴스에 대한 포인터에 추가 할 바이트 수 (예 :'reinterpret_cast''를'char *'라고 부름)를 의미합니까? 그렇다면 간단한 빼기가 말하지 않습니까? –
이러한 유형에 대해 정의 된 경우'offsetof (A, i)'를 사용할 수 있습니다. 컴파일러 설명서를 확인하십시오. –
다음은 [link] (http://www.cplusplus.com/reference/clibrary/cstddef/offsetof/)에서 offsetof()를 사용하는 예제 코드입니다. – Hindol