我需要用内部类的大小公开编译时常量。为此,我尝试了下一个代码:
#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
。
您是否知道在sizeof(A::Private)
之外公开A
作为编译时常量的方法,但保持Private
类...私有?请注意我无法使用constexpr
,因为代码将用于某些旧编译器。
答案 0 :(得分: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;
}