如何使用gsl窄铸件



我正在努力了解如何使用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::narrowgsl::narrow_cast。我的第一个问题是如何使用gsl函数?我在网站上看了其他问题,还没有找到一个告诉如何查看gsl类/库的问题(我正在构建一个dll(第二个问题是,这个函数的正确语法是什么,在这种情况下是否有必要更改它?谢谢

GSL最初是作为微软对C++核心准则的实现而创建的。但这并不是它的唯一实现。另一个实现是(仅头(gsl-lite。

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

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

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

这两种类型都在这里的核心指南(ES.46(中介绍

相关内容

  • 没有找到相关文章

最新更新