шаблоны — Как лучше всего в C ++ иметь константу времени компиляции в зависимости от размера типа?

Я думал об одном из них:

#if sizeof(size_t) == 8
const size_t foo = 12345;
#elif sizeof(size_t) == 4
const size_t foo = 123;
#else
#error "Unsupported size_t size"#endif

или же

template <int S> class Foo { static const size_t foo = 0; };
template <> class Foo<8> { static const size_t foo = 12345; };
template <> class Foo<4> { static const size_t foo = 123; };
const size_t foo = Foo<sizeof(size_t)>::foo;

Кроме того, как я могу выдать ошибку времени компиляции, используя второй метод?

1

Решение

Решение с шаблоном класса — хороший идиоматический способ сделать это (первый вариант также не сработает, так что это не соревнование между этими двумя кандидатами).

Чтобы вызвать ошибку во время компиляции, просто не определяйте шаблон для всех размеров:

template <int S> class Foo;

Затем компилятор будет жаловаться, что шаблон не определен для оскорбительного значения sizeof(size_t),

Это также поможет изменить имя с Foo что-то вроде Environment_Where_sizeof_int_is — вы получите более понятные ошибки компилятора на практике.

4

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

С g++ Вы также можете использовать следующие предопределенные макросы:

__SIZEOF_SIZE_T__
__SIZEOF_INT__
__SIZEOF_LONG__

(и так далее для других типов, см. документация для полного списка).

Например:

#if __SIZEOF_SIZE_T__ == 8
const size_t foo = 12345;
#elif __SIZEOF_SIZE_T__ == 4
const size_t foo = 123;
#else
#error "Unsupported size_t size"#endif
1

Используйте тип для первого и второго элемента определенной структуры и получите смещение второго элемента, чтобы получить размер первого элемента (предполагается, что между первым и вторым элементом нет заполнения, первый элемент гарантированно имеет одинаковый адрес как структура).

#define ofs(s,m)   (size_t)&(((s *)0)->m)

typedef struct S_{
size_t a;       /* type to get the size of */
size_t b;       /* make this same type as above */
}S;

int main()
{
size_t c;
c = ofs(S,b);   /* get size of S.a */
return(0);
}
0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector