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)>);