【问题标题】:static_assert'ion that a long and int are the Same Typestatic_assert'ion 表示 long 和 int 是同一类型
【发布时间】:2019-01-02 20:51:16
【问题描述】:

所以我从一个 API 中获取一个变量,我们将其命名为 long foo 并将其传递给另一个 API,该 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 之外,是否有解决方法?

【问题讨论】:

  • static_assert(sizeof(int) == sizeof(long))?
  • 类型不一样。也许您想知道它们的长度是否相同?
  • 如果你想将你的代码移植到其他平台,你应该假设intlong是一样的。

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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多