2014-01-30 2 views
2

내부 클래스의 크기와 함께 컴파일 시정 수를 노출해야합니다.개인 내부 클래스 크기 노출

#include <cassert> 

struct A 
{ 
    //consider Private class as private for this example, just to be able to put the assert like this in main 
    class Private{}; 
    enum { PrivateSize = sizeof(Private) }; 
}; 

int main() 
{ 
    //here I have warning on some compilers, signed/unsigned comparison 
    assert(A::PrivateSize == sizeof(A::Private)); 
} 

내 문제가 PrivateSize 일부 컴파일러에 서명하고 다른 사람에 서명하고 서명 유형과 비교했을 때 이것에 대해 경고를받을된다는 점이다 : 그래서 나는 다음 코드를 시도 할 수 있습니다. 내가 아는 한 enum의 기본 유형은 구현 정의이며 강제적으로 signed 또는 unsigned이 될 수 없습니다.

A 외부에 sizeof(A::Private)을 노출시키는 방법을 알고 있습니까? 컴파일시 일정한 시간이지만, Private 클래스를 private로 유지 하시겠습니까? 코드는 일부 오래된 컴파일러에서 사용되므로 constexpr을 사용할 수 없습니다.

+0

난 당신이 DieterLücking @ –

+0

내가이를 변경할 수 있습니다 변경할 수 없습니다 생각,하지만 난 – Felics

+0

개인 내부 클래스를 유지해야 경고하지 마십시오. – Jarod42

답변

4

다음 작품 : 당신은 대신 열거의`const 정적 부호 PrivateSize`을 사용할 수 있습니다

struct A 
{ 
    friend int main(int argc, char *argv[]); // For test purpose 
private: 
    class Private{}; 
public: 
    static const unsigned int PrivateSize = sizeof (Private); 
}; 

int main(int argc, char *argv[]) 
{ 
    assert(A::PrivateSize == sizeof(A::Private)); 
    return 0; 
}