问题标签 [guideline-support-library]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1142 浏览

c++ - c++ 中 gsl 断言与断言的优势?

我知道assert在 C++ 中的使用。想知道两者之间是否有任何区别和任何好处(我认为根据https://www.learncpp.com/cpp-tutorial/7-12a-assert-and-static_assert/assert中提到的成本更高,所以性能明智,两者都是一样吗?)在使用结束?为什么在 gsl 库中添加,因为在 c++ 中已经有支持(即使来自“C”,因为我们添加用于在 C++ 中使用)?gsl_assertassertgsl_assertassertassert#include<cassert>assert

0 投票
1 回答
104 浏览

c++ - 为什么 GSL-Lite 试图包含?

我正在尝试在我的嵌入式 STM32 Keil 项目中使用 gsl。我的 Keil 项目最多使用过时的 semi c++11 编译器。(这是我的 ST 库为 LoRaWAN 设置的约束)。我正在使用 keil 捆绑的 V5.06 update 6 (build 750) ARM Compiler。Keil 选择不实施std::araySTL。我对此感到非常失望,但是我能做些什么。

我选择使用gsl-Lite。它应该是兼容的C++98C++03所以std::array不需要,但是当我尝试使用包含在我的包含路径中的库来编译我的代码时,我收到了这个构建消息:

..\Core\inc\gsl/gsl-lite.hpp(405): error: #5: cannot open source input file "array": No such file or directory
# include <array>

但是第 404 行以这段代码开头:

在我看来,他们正在尝试确定是否<array>可以包括在内。我的编辑器将此块变灰,就好像它没有被定义一样。

gsl_HAVE 定义为:

我不明白这是如何工作的,以及如何检查是否ARRAY未正确定义。

我不想不包含<array>,所以我的代码可以构建和使用 gsl-lite。我的首选选项是带有定义的东西。

更新

据我了解包含系统:

被定义为自动排除一个特征(gsl_HAVE_ARRAY在这种情况下),当

被评估为真实。gsl_CPLUSPLUS定义为

但我似乎无法弄清楚__cplusplus.

0 投票
2 回答
699 浏览

c++ - 将 gsl::zstring_view 与 C API 一起使用

我正在尝试使用现代字符串处理方法(如std::string_viewGSL'sstring_span)与将字符串作为空终止的 C API(DBus)进行交互const char*,例如

string_view并且string_span不保证它们的内容是空终止的——因为跨度是(char* start, ptrdiff_t length)对的,这在很大程度上是重点。但是 GSL 也提供了一个zstring_view,它保证是空终止的。周围的评论zstring_span表明它是专为处理遗留 API 和 C API 而设计的,但我一开始使用它就遇到了几个症结:

  1. 将字符串文字表示为 astring_span很简单:

    但是将一个表示为 azstring_span需要您将文字包装在辅助函数中:

    这使得声明更加嘈杂,而且文字(保证以 null 结尾)不能隐式转换为 a 似乎也很奇怪zstring_spanensure_z()也不是constexpr,不像string_span.

  2. 有一个类似的奇怪之处std::string,它可以隐式转换为string_span,但不是zstring_span,尽管std::string::data()自 C++11 以来已保证返回一个以空值结尾的序列。同样,您必须致电ensure_z()

    /li>
  3. 似乎存在一些 const 正确性问题。上述工作,但

    编译失败,出现关于无法转换为的span<char, ...>错误span<const char, ...>

  4. 这一点比其他点小,但返回 a 的成员函数char*(您可以将其提供给像 DBus 这样的 C API)被调用assume_z()。当构造函数期望一个以空值结尾的范围时,会假设什么?zstring_span

如果zstring_span设计为“将零终止跨度转换为遗留字符串”,为什么在这里使用它看起来如此麻烦?我在滥用它吗?有什么我忽略的吗?

0 投票
2 回答
602 浏览

c++ - 我可以在 C++ 中返回一个跨度吗?如果是这样,怎么做?(对替代品开放。)

我得到的作业项目指南特别禁止使用向量和字符串,但我需要从函数传递一个大小不确定的 char 数组。如果我能更好地理解它是如何使用的,那么跨度的使用似乎可行的。如果有人可以推荐一种更好/不同的传递数组的方法(除了字符串和向量),我很想了解它。

我考虑过生成一个暂存文件并将输入文本存储在那里以便在程序的其他地方调用,但这似乎比在这种情况下所必需的要麻烦得多。这个程序也足够小,我可以在 main 中做所有事情,但这也不应该是必需的。

我想做的是能够调用这样的函数:

然后从 main 打印 spanOut 的内容:

理想情况下,上述代码的结果将ABC打印到终端。

0 投票
2 回答
4358 浏览

c++ - narrow_cast 有什么作用?

我看到了这样使用的narrow_cast代码

问题是我的编译器说:

我应该定义narrow_cast自己还是以错误的方式使用它,还是没有类似的东西narrow_cast

0 投票
4 回答
92 浏览

c++ - 是否可以仅在需要时缩小?

bar假设我在另一个库中定义了以下代码:

为了使故障可检测,GSL 指示我gsl::narrow按如下方式使用:

我的问题是,假设我知道void bar(long long x);可能会出现在该库的未来版本中,第一个版本会自动切换到使用它(通过推演规则),而第二个版本不会。有没有办法在void bar(long long x);不可用时检测缩小故障,并在释放时切换到仅调用它?

我试过了:

  • bar(narrow(y));,但无法推断出narrow的模板参数。
  • bar(superint{y}), 其中 superint 是 a对andstruct {long long x;}都具有重载类型转换运算符,后者具有窄检查。这是我最好的主意,因为它在添加时会给出编译时错误,让我们知道在合适的时候更新代码库的地方。不过,它看起来不像你会放在 GSL 中的东西,所以我不太满意..long longintambiguous callvoid bar(long long x);

更新

有很多好的答案,但它们都必须按函数而不是按参数来实现。理想情况下,解决方案应该类似于 GSL,您只需对有缩小风险的论点做一些事情。访问者模式在这里可能很有用,我们只需要重写quz(xi,yi,z,w)superint_visit(quz, superint{xi},superint{xi},z,w);假设 xi 和 yi 是有缩小风险的整数参数。就像是:

以上所有内容都可以存在于gsl命名空间中,我只需将我的函数编写为:

即使我在这里接受了答案,我仍然希望听到任何可以实现上述目标的人!

0 投票
1 回答
76 浏览

c++ - std::basic_string_view 之间的区别和 std::span

我正在解析二进制网络数据,我想让这个过程尽可能少分配。但现在我意识到有 2 个非常相似的概念对于我的情况可能都足够好,它们是std::basic_string_view<T>std::span<T>

所以我想知道。这两者之间有什么区别,使用其中一个有什么优势?一个明显的区别是可用性,std::basic_string_view已经在 C++17 中,而std::span在 C++20 中(但您可以使用“指南支持库”中的旧标准)。但是还有别的吗?它应该,因为否则他们不会都将其纳入标准。

0 投票
1 回答
99 浏览

c++ - 在命名空间中找不到 gsl::fail_fast

在这个 C++ 合约的简单使用中,我得到了error: no type named 'fail_fast' in namespace 'gsl'. 尝试块会抛出fast_fail异常或其他异常吗?

0 投票
2 回答
149 浏览

c++ - 你打算从违反合同的情况中恢复过来吗?

借助指南支持库和gsl_ExpectsC++ 等实用程序,暂时实现了合约(有计划在未来将这些东西融入语言中)。使用此功能并根据您的项目设置,可能会违反合同:

  • 抛出异常或
  • 呼叫终止

我想知道恢复策略应该是什么。显然在第二种情况下(您设置违反合同以调用终止)没有,但即使在第一种情况下也很难恢复;由于异常是某种内部类型(例如,fail_fast源自logic_error旨在供人类读者进行事后分析)。

因此,鉴于所有这些,我的问题是:您是否打算从违反合同的情况中恢复过来?如果是怎么办?有没有描述如何做到这一点的来源?如果不是,将我的错误检查+处理与合同检查分开,只考虑硬错误方面的合同是个好主意吗?

我想第二个选择是我倾向于的,但令人讨厌的是,这些违规行为会导致我的整个程序崩溃,而不是取消单个函数。

我可以像这样构建合同轴承功能:

但感觉它超出了使用合同的目的。