Выставить приватный внутренний размер класса

Мне нужно выставить константу времени компиляции с размером внутреннего класса. Для этого я попробовал следующий код:

#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 так как код будет использоваться на некоторых старых компиляторах.

2

Решение

Следующие работы:

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

Другие решения

Других решений пока нет …