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,底层类型是实现定义的,不能强制为signedor unsigned

您是否知道一种将sizeof(A::Private)外部公开A为编译时间常数但保持Private类...私有的方法?请注意我不能使用constexpr,因为代码将在一些旧的编译器上使用。

4

1 回答 1

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;
}
于 2014-01-30T14:28:34.817 回答