【问题标题】:How to use gsl narrow cast如何使用 gsl 窄投
【发布时间】:2021-02-15 01:46:42
【问题描述】:

我想了解如何使用gsl::narrow_cast 而不是static_cast。 我在 stackoverflow 上找到了一个函数,它有一个字符串作为参数,如果所有字符都是 ASCII(前 127 个字符)则返回 true。

bool IsCleanString(const std::string& str)
{
    return !std::any_of(str.begin(), str.end(), [](char c) {
        return narrow_cast<unsigned char>(c) > 127;
    });
}

我已经在我的代码中实现了这个功能,我注意到 Visual Studio 建议使用gsl::narrow 或gsl::narrow_cast。 我的第一个问题是如何使用 gsl 函数?我已经查看了网站上的其他问题,但我还没有找到一个能够说明如何查看 gsl 类/库的问题(我正在构建一个 dll) 第二个问题是这个函数的正确语法是什么,在这种情况下是否有必要改变它? 谢谢。

【问题讨论】:

    标签: c++ dll cpp-core-guidelines


    【解决方案1】:

    GSL 最初创建为 Microsoft 的 implementation 和 C++ Core Guidelines。但这不是它的唯一实现。另一种实现是(仅标头)gsl-lite。

    gsl::narrow 是一个static_cast,它检查信息是否通过强制转换丢失,然后抛出异常。丢失信息意味着转换回初始类型将给出与输入不同的值。

    实际上,这意味着gsl::narrow&lt;unsigned&gt;(42) 的行为与static_cast 相同,而gsl::narrow&lt;unsigned&gt;(-42) 将抛出。另一个例子是gsl::narrow&lt;int&gt;(42.0)(类似于static_cast)和gsl::narrow&lt;int&gt;(42.1)(例外)。当gsl::narrow 检查它的结果时,它可能会对性能产生负面影响,例如在热循环中使用时。

    如果您想丢失信息(例如分箱)但想要标记此行为(使其可在您的代码中搜索),您可以使用 gsl::narrow_cast,它只是 static_cast 的包装器(语法相同,相同行为)。

    核心指南here (ES.46) 中介绍了这两种类型。

    【讨论】:

      猜你喜欢
      • 2012-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-05
      • 2017-02-11
      • 1970-01-01
      • 2021-11-24
      • 2013-12-25
      相关资源
      最近更新 更多