Если вы не можете использовать C ++ 11 или Boost, то вы можете найти это полезным:
template <typename A, typename B>
struct MustBeSameSize {
int c[sizeof(A)-sizeof(B)];
int d[sizeof(B)-sizeof(A)];
};
template struct MustBeSameSize<int, int>;
Это скомпилируется только тогда и только тогда, когда sizeof
два типа идентичны.Если они отличаются следующим образом:
template struct MustBeSameSize<char, int>;
, тогда вы получите ошибку типа компиляции, но это не будет очень читаемой ошибкой;может быть что-то вроде (g ++ 4.4.3):
error: overflow in array dimension
Это работает, потому что любой современный компилятор должен разрешать массивы нулевой длины, но не массивы отрицательной длины.
Это работает для меня, и я думаю, что G ++ разрешил массивы нулевой длины в течение некоторого времени.Но я не уверен, насколько это портативно.C99 допускает гибкие члены массива (то есть неопределенный размер), но я не думаю, что это имеет прямое отношение.Короче говоря, если вам нужно что-то переносимое, используйте C ++ 11 или Boost.