static_assert'ion,一个long和int是同一类型

时间:2019-01-02 20:51:17

标签: c++ visual-studio-2017 int long-integer static-assert

所以我要从一个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)>);

因为即使这些有效地相同,它们也不是同一类型。除了使用数值限制库将longint匹配之外,是否有其他解决方法?

1 个答案:

答案 0 :(得分:7)

longint是不同的基本类型。即使它们的大小相同,也不是相同的类型,所以is_same_v永远不会是true。如果需要,可以检查它们的大小是否相同,然后继续

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

您甚至可以确保foobar是整数类型,例如

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