我正在努力了解如何使用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(第二个问题是,这个函数的正确语法是什么,在这种情况下是否有必要更改它?谢谢
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(中介绍