具有模板参数大小的 const char 数组与 char 指针

2024-01-23

今天我在一些代码中看到了以下类型的构造:

template<unsigned int N> unsigned int f(const char (&a)[N]);

拥有这个比拥有以下有任何合理的意义吗?

unsigned int f(const char *a);

我隐约理解后者的指针共享含义,但它真的那么糟糕吗,以至于需要用两倍大小的晦涩代码替换它?

(不幸的是,我不能问代码的作者,否则我会的)


将任何原始指针传递给函数的目的是caller有一些想法:

  • 它指向什么。
  • 它指向多少个。

作为输入参数的 C 样式字符串推断出后者,因为假设到达空字符终止符时就认为“有多少”。

但如果你是not传递 C 风格的字符串?如果它只是零个或多个的序列怎么办char价值观?好吧,如果是这样的话,那么:

void f(const char *s)
{
    // how many char does s refer to?
}

逻辑推论是这样做:

void f(const char *s, std::size_t N)
{
    // Now the caller is telling us there are N chars at s
}

这一点也不罕见,尽管如果调用者向我们传递了错误的长度(永远不要说永远),则可能会出现潜在的错误。

但是如果有一种方法可以从实际变量中获取这些数据呢?type通过非类型模板参数使用推导传递给函数?如果调用者使用固定数组调用我们怎么办?

template<std::size_t N>
void f(const char(&ar)[N])
{
    // we know the caller is passing a const-reference to a
    // char array declared of size N. The value N can be used
    // in this function.
}

现在我们知道列表中的两项:“什么”和“多少”。此外,我们现在可以提供both一个模板函数和一个overload并且我们可以使用两个世界:

// length specified implementation
void f(const char *s, std::size_t N)
{
    // caller passed N
}

// fixed buffer template wrapper
template<std::size_t N>
void f(const char(&ar)[N])
{
    f(ar,N); // invokes length-specified implementation from above.
}

以下两项都将起作用:

int main()
{
    char buff[3];

    f(buff,3);
    f(buff);

}

那么这有多好呢?因为以下内容将标记编译器错误,因为找不到匹配的实现:

int main()
{
    char buff[3];
    const char *ptr = buff;
    f(ptr); // ERROR: no matching function f(const char *)
}

总之,这是一种常见的技术,可以帮助向被调用者提供项目符号列表中的两项:“什么”和“多少”,而无需长期操作sizeof(ar)/sizeof(*ar)每次使用固定长度的本机数组作为输入参数时。

祝你好运。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

具有模板参数大小的 const char 数组与 char 指针 的相关文章

  • 通过 CMIS (dotCMIS) 连接到 SP2010:异常未经授权

    我正在使用 dotCMIS 并且想要简单连接到我的 SP2010 服务器 我尝试用 C 来做到这一点 如下所示http chemistry apache org dotnet getting started with dotcmis htm
  • 为什么 C# Array.BinarySearch 这么快?

    我已经实施了一个很简单用于在整数数组中查找整数的 C 中的 binarySearch 实现 二分查找 static int binarySearch int arr int i int low 0 high arr Length 1 mid
  • WCF RIA 服务 - 加载多个实体

    我正在寻找一种模式来解决以下问题 我认为这很常见 我正在使用 WCF RIA 服务在初始加载时将多个实体返回给客户端 我希望两个实体异步加载 以免锁定 UI 并且我想利用 RIA 服务来执行此操作 我的解决方案如下 似乎有效 这种方法会遇到
  • 为什么两个不同的 Base64 字符串的转换会返回相等的字节数组?

    我想知道为什么从 base64 字符串转换会为不同的字符串返回相同的字节数组 const string s1 dg const string s2 dq byte a1 Convert FromBase64String s1 byte a2
  • 在结构中使用 typedef 枚举并避免类型混合警告

    我正在使用 C99 我的编译器是 IAR Embedded workbench 但我认为这个问题对于其他一些编译器也有效 我有一个 typedef 枚举 其中包含一些项目 并且我向该新类型的结构添加了一个元素 typedef enum fo
  • 用于登录 .NET 的堆栈跟踪

    我编写了一个 logger exceptionfactory 模块 它使用 System Diagnostics StackTrace 从调用方法及其声明类型中获取属性 但我注意到 如果我在 Visual Studio 之外以发布模式运行代
  • OleDbDataAdapter 未填充所有行

    嘿 我正在使用 DataAdapter 读取 Excel 文件并用该数据填充数据表 这是我的查询和连接字符串 private string Query SELECT FROM Sheet1 private string ConnectStr
  • Clang 3.1 + libc++ 编译错误

    我已经构建并安装了 在前缀下 alt LLVM Clang trunk 2012 年 4 月 23 日 在 Ubuntu 12 04 上成功使用 GCC 4 6 然后使用此 Clang 构建的 libc 当我想使用它时我必须同时提供 lc
  • 将 VSIX 功能添加到 C# 类库

    我有一个现有的单文件生成器 位于 C 类库中 如何将 VSIX 项目级功能添加到此项目 最终目标是编译我的类库项目并获得 VSIX 我实际上是在回答我自己的问题 这与Visual Studio 2017 中的单文件生成器更改 https s
  • 带动态元素的 WPF 启动屏幕。如何?

    我是 WPF 新手 我需要一些帮助 我有一个加载缓慢的 WPF 应用程序 因此我显示启动屏幕作为权宜之计 但是 我希望能够在每次运行时更改屏幕 并在文本区域中显示不同的引言 这是一个生产力应用程序 所以我将使用非愚蠢但激励性的引言 当然 如
  • 如何在 C 中调用采用匿名结构的函数?

    如何在 C 中调用采用匿名结构的函数 比如这个函数 void func struct int x p printf i n p x 当提供原型的函数声明在范围内时 调用该函数的参数必须具有与原型中声明的类型兼容的类型 其中 兼容 具有标准定
  • 这些作业之间是否存在顺序点?

    以下代码中的两个赋值之间是否存在序列点 f f x 1 1 x 2 不 没有 在这种情况下 标准确实是含糊不清的 如果你想确认这一点 gcc 有这个非常酷的选项 Wsequence point在这种情况下 它会警告您该操作可能未定义
  • 覆盖子类中的字段或属性

    我有一个抽象基类 我想声明一个字段或属性 该字段或属性在从该父类继承的每个类中具有不同的值 我想在基类中定义它 以便我可以在基类方法中引用它 例如覆盖 ToString 来表示 此对象的类型为 property field 我有三种方法可以
  • 通过指向其基址的指针删除 POD 对象是否安全?

    事实上 我正在考虑那些微不足道的可破坏物体 而不仅仅是POD http en wikipedia org wiki Plain old data structure 我不确定 POD 是否可以有基类 当我读到这个解释时is triviall
  • cmake 将标头包含到每个源文件中

    其实我有一个简单的问题 但找不到答案 也许你可以给我指一个副本 所以 问题是 是否可以告诉 cmake 指示编译器在每个源文件的开头自动包含一些头文件 这样就不需要放置 include foo h 了 谢谢 CMake 没有针对此特定用例的
  • 如何在Xamarin中删除ViewTreeObserver?

    假设我需要获取并设置视图的高度 在 Android 中 众所周知 只有在绘制视图之后才能获取视图高度 如果您使用 Java 有很多答案 最著名的方法之一如下 取自这个答案 https stackoverflow com a 24035591
  • 混合 ExecutionContext.SuppressFlow 和任务时 AsyncLocal.Value 出现意外值

    在应用程序中 由于 AsyncLocal 的错误 意外值 我遇到了奇怪的行为 尽管我抑制了执行上下文的流程 但 AsyncLocal Value 属性有时不会在新生成的任务的执行范围内重置 下面我创建了一个最小的可重现示例来演示该问题 pr
  • 测试用例执行完成后,无论是否通过,如何将测试用例结果保存在变量中?

    我正在使用 NUNIT 在 Visual Studio 中使用 Selenium WebDriver 测试用例的代码是 我想在执行测试用例后立即在变量中记录测试用例通过或失败的情况 我怎样才能实现这一点 NUnit 假设您使用 NUnit
  • C++ 标准是否指定了编译器的 STL 实现细节?

    在写答案时this https stackoverflow com questions 30909296 can you put a pimpl class inside a vector我遇到了一个有趣的情况 这个问题演示了这样一种情况
  • 使用.NET技术录制屏幕视频[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有没有一种方法可以使用 NET 技术来录制屏幕 无论是桌面还是窗口 我的目标是免费的 我喜欢小型 低

随机推荐

  • MS-SQL 中是否有与 SHA1() 等效的函数?

    将几个存储过程从 MySQL 转换为 Microsoft SQL Server 一切都很顺利 除了一个程序使用了 MySQLSHA1 功能 我似乎无法在 MS SQL 中找到与此等效的内容 有谁知道有效的等价物SHA1 在 MS SQL 上
  • OpenCV 的视频捕获不返回图像

    所以我尝试开始使用 OpenCV 进行图像检测 我正在用 Python 编程 我从 openCV2 的人脸检测示例开始 然而 即使打开相机设备 也不会返回任何图像 违规代码 cam cv2 VideoCapture 0 print cam
  • 强制 MigLayout 像 GridBagLayout 一样收缩隐藏对象

    我正在尝试更换GridBagLayout with MigLayout 问题是如果我打电话obj setVisible false 对于某些对象GridBaglayout 布局缩小 但在MigLayout它只是保持隐藏状态 你知道一些方法吗
  • 从 Excel 导入 - 标题不在第 1 行

    我是否缺少一些简单的方法来使用 OleDBConnection 将 Excel 工作表导入数据表并更改标题所在的行 我的连接字符串中有 HDR YES 当标题位于第 1 行但标题实际上需要位于第 3 行时效果很好 我正在使用以下 Comma
  • ggplot 饼图中的标签错误

    我正在尝试为百分比值创建饼图 当我尝试为它们添加标签时 标签是错误的 我的意思是这些值指向图表中的错误位置 ggplot Consumption building type aes x y percentage fill Building
  • 如何对齐 Bootstrap 导航栏中留下的品牌标题和链接?

    我是 Bootstrap 的新手 我一直在努力了解导航栏 我注意到 当浏览器为全 宽屏 宽度时 品牌标题和导航锚点保持在页面的左侧中心 而不是像窗口较小时那样与页面的最左侧对齐 如何使导航栏中的文本紧贴页面左侧 无论浏览器窗口有多宽 我都希
  • async/await 如何在 ASP.Net 应用程序中提供帮助?

    在MVC控制器的action方法中使用async await可以扩展Web应用程序 因为在await时 Asp Net线程池的请求线程被释放 以便它可以为该工作进程处理IIS队列中的其他请求 这意味着 如果我们将工作进程的队列长度限制为 1
  • 如何知道 JUnit 测试触及了哪些类

    以编程方式了解 JUnit 测试涉及哪些类的有效方法是什么 正确的知道 我正在用以下工具来检测我的整个代码JaCoCo http www eclemma org jacoco 获取每行代码的代码覆盖率信息 然后我可以找出使用了哪些类 是否可
  • 我应该如何在类层次结构中链接构造函数?

    我们有以下类层次结构 public class Base public Base do generic initialization public Base SomeClass param1 this init properties tha
  • “额外的间接级别可以解决所有问题”这句话是什么意思? [关闭]

    Closed 这个问题是与编程或软件开发无关 help closed questions 目前不接受答案 计算机科学中的 间接级别解决每个问题 这句话是什么意思 一般来说 这意味着通过提高抽象级别可以使问题更容易理解 解决 不过 要小心你的
  • 隐藏第 n 最大行的 VBA 代码

    Excel 2010 VBA 中是否有任何代码可以用来隐藏第 n 行 例如第 200 行 到最大行 顺便说一句 该表的名称特别是main 通常我会告诉你尝试否决你的问题 但是嘿 今天早上我很懒 所以我只会给你你没有找到的答案 Rows 20
  • 如何从 spring RESTful 服务返回 JSON 并使用 RestTemplate 类访问它

    我制作了一个 Spring RESTful Web 服务 用于以 JSON 格式提供热门歌曲列表 为此 我在列表中添加了歌曲名称 并从 Spring RESTful Web 服务的 Restcontroller 返回了该名称 所以 Rest
  • LinearLayout 的点击监听器永远不会被调用

    尝试让 onclick 侦听器在线性布局上工作 但它从未被调用 已启用可点击和可聚焦 两种模式 但仍然无法让点击侦听器响应 平台详细信息 Android 3 0 有任何帮助吗 下面的代码
  • 使用表单生成器将字段的值显示到 Rails 中的标签中

    我正在使用 Rails 3 2 并且需要使用表单生成器对象显示标签中字段的值 在文本框中显示它很简单 但我无法在标签中做到这一点 代码是这样的 上面的 f 是我的表单生成器 我的模型有一个名为 key name 的字段 第二行工作正常 我将
  • addslashes() 可以安全地防止 HTML 属性中的 XSS 吗?

    我不得不开发一个以前的开发人员留下的旧网络应用程序 它使用addslashes 来防止HTML属性上的XSS 这是一个例子 这是否容易受到 XSS 攻击 有没有什么方法可以让 javascript 在 value 属性中运行 就像在 src
  • 未定义的方法“分页”

    我正在尝试使用 will paginate gem 但出了点问题 我被困住了undefined method paginate 错误 我读了很多问题并尝试了很多事情 这是我所得到的 这是我的 LocationsController rb d
  • 在 pytube 中显示进度

    import pytube def video downloader vid url str input Enter Video URL print Connecting Please wait video pytube YouTube v
  • 在 ASP.NET 中处理数据时如何更新进度消息?

    我有一个流程 它输出逐步消息 即 处理项目 1 项目 2 中的错误等 我希望在整个过程中 而不是最后 将其输出给用户 我很确定我需要使用线程来完成此操作 但找不到合适的示例 这不是线程问题 而是 Web 浏览器 UI 问题 您希望浏览器在您
  • 如何仅对我想要提交的文件运行 Prettier?

    Using Husky https github com typicode husky 我已经设置了我的package json使用预提交挂钩 以便我的 JavaScript 代码使用以下格式进行格式化Prettier https pret
  • 具有模板参数大小的 const char 数组与 char 指针

    今天我在一些代码中看到了以下类型的构造 template