static_assert'ion, что long и int - это один и тот же тип

Итак, я беру переменную из одного API, мы будем называть ее long foo и передать его другому API, который принимает это значение: int bar,

Я нахожусь в visual-studio-2017, где это одно и то же: https://docs.microsoft.com/en-us/cpp/cpp/data-type-ranges?view=vs-2017

Но это выстрелит

static_assert(is_same_v<decltype(foo), decltype(bar)>);

Потому что, хотя они фактически одинаковы, они не одного типа. Есть ли обходной путь для этого, кроме использования библиотеки числовых пределов для соответствия long для int?

1 ответ

Решение

long а также int разные фундаментальные типы. Даже если они одного размера, они не одного типа, поэтому is_same_v никогда не будет true, Если вы хотите, чтобы вы могли проверить, что их размеры одинаковы, тогда переходите к

static_assert(sizeof(foo) == sizeof(bar));

Вы даже можете убедиться, что foo а также bar являются интегральными типами, такими как

static_assert(sizeof(foo) == sizeof(bar) && 
              std::is_integral_v<decltype(foo)> && 
              std::is_integral_v<decltype(bar)>);

Вы также можете убедиться, что они имеют такую ​​же подпись, как

static_assert(sizeof(foo) == sizeof(bar) && 
             std::is_integral_v<decltype(foo)> && 
             std::is_integral_v<decltype(bar)> &&
             std::is_signed_v<decltype(foo)> == std::is_signed_v<decltype(bar)>);
Другие вопросы по тегам