Мне нужно выставить константу времени компиляции с размером внутреннего класса. Для этого я попробовал следующий код:
#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
так как код будет использоваться на некоторых старых компиляторах.
Следующие работы:
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;
}
Других решений пока нет …