static_assert'ion, что long и int - это один и тот же тип - PullRequest
0 голосов
/ 02 января 2019

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

Я в , в которой это фактически одно и то же: 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 Ответ

0 голосов
/ 02 января 2019

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