2014-01-30 41 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的基础类型是实现定义的,不能被强制为signedunsigned

你知道一种方法来暴露A之外sizeof(A::Private)作为编译时间常数,但保持Private类...私人?请注意,我不能使用constexpr,因为代码将用于一些旧的编译器。

+0

我想你不能改变一个 –

+0

@DieterLücking我可以改变,但我必须保持内部类私有 – Felics

+0

你可以使用'静态常量无符号PrivateSize'而不是枚举避免警告。 – Jarod42

回答

4

以下工作:

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; 
}