C++ 和 C 可变参数如何一起使用?

2024-01-22

通常,将 C++11 可变参数模板功能与函数一起使用需要基于可变参数的函数参数位于函数参数列表中的最后一个。有一个例外:如果存在 C 级可变参数,它们是倒数第二个参数,这必须是最后一个。

template < typename ...Args >
int  super_printf( Something x, Args &&...a, ... );

有时我会随机想到C++,我想知道这样的功能如何实现。我首先想到了通常的递归剥离参数a,然后我想起 C 级可变参数不会级联。我必须立即将它们转为明确的 va_list。

template < typename ...Args >
int  super_vaprintf( Something x, std::va_list &aa, Args &&...a );
// Note that "aa" is passed by reference.

template < typename ...Args >
int  super_printf( Something x, Args &&...a, ... )
{
    std::va_list  args2;
    int           result;

    va_start( args2, XXX );  // (A)
    try {
        result = super_vaprintf( x, args2, std::forward<Args>(a)... );
    } catch ( ... ) {
        va_end( args2 );  // (1)
        throw;
    }
    va_end( args2 );  // (2)
    return result;

    // Can (1) and (2) be compacted with RAII using a custom deleter lambda
    // in std::unique_ptr or something?  Remember that "va_end" is a macro!
}

通常的 C++ 可变参数递归剥离发生在super_vaprintf称呼。在 (A) 行,什么取代了XXX、“一个”还是“一个……”?如果发生什么情况a是空的,确实x去那里吗?如果最后一个问题是真的,如果没有的话我们就完蛋了x;除了可变参数之外没有参数吗? (如果这是真的,我们如何条件化代码以使用x when a是空的,并且a否则?)

...

我只是查看了 C++11 标准的副本,以获取此处的任何帮助。好像没有啊这将提示 C++ 委员会回来修复此问题,但我不确定是否有任何方法可以在 C++ 可变参数不接管所有内容的情况下调用此类函数。我错了吗;可以进行函数调用以同时使用 C++ 和 C 可变参数吗?或者就愚蠢的(模板)实例化技巧而言,混合仅对声明有用吗?


当您调用最后一个参数是包的函数时,所有参数都将成为该包的一部分。没有什么可以留下的va_args。您对显式模板参数的使用具有误导性,因为它们不是排他性的;它们只是位于隐式参数之前。

为了击败演绎,你需要一个参考:

(& super_printf<int, int>) ( 0L, 1, 2, 3, 4, 5 )

这是相当做作的,但是now你有没有什么可以传递给的问题va_start.

为了给用户提供一个合理的接口,只需在两个列表之间添加一个参数即可。

struct va_separator {}; // Empty; ABI may elide allocation.

template < typename ...Args >
int  super_printf( Something x, Args &&...a, va_separator, ... );

This super_printf将需要显式参数来定义包和显式分隔符参数。但是您也可以提供一个公共函数,该函数通过 pack 接收其所有参数,然后找到分隔符并转发到super_printf使用包含分隔符之前的包元素的显式参数列表。

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

C++ 和 C 可变参数如何一起使用? 的相关文章

  • C++:无法使用scoped_allocator_adaptor传播polymorphic_allocator

    我有一个vector
  • fgets() 和 Ctrl+D,三次才能结束?

    I don t understand why I need press Ctrl D for three times to send the EOF In addition if I press Enter then it only too
  • Cygwin 下使用 CMake 编译库

    我一直在尝试使用 CMake 来编译 TinyXML 作为一种迷你项目 尝试学习 CMake 作为补充 我试图将其编译成动态库并自行安装 以便它可以工作 到目前为止 我已经设法编译和安装它 但它编译成 dll 和 dll a 让它工作的唯一
  • 如何在我的应用程序中使用 Windows Key

    Like Windows Key E Opens a new Explorer Window And Windows Key R Displays the Run command 如何在应用程序的 KeyDown 事件中使用 Windows
  • 为什么 POSIX 允许在只读模式下超出现有文件结尾 (fseek) 进行搜索

    为什么寻找文件结尾很有用 为什么 POSIX 让我们像示例中那样在以只读方式打开的文件中进行查找 c http en cppreference com w c io fseek http en cppreference com w c io
  • 为什么禁止在 constexpr 函数中使用 goto?

    C 14 对你能做什么和不能做什么有规则constexpr功能 其中一些 没有asm 没有静态变量 看起来相当合理 但标准也不允许goto in constexpr功能 即使它允许其他控制流机制 这种区别背后的原因是什么 我以为我们已经过去
  • c 中的错误:声明隐藏了全局范围内的变量

    当我尝试编译以下代码时 我收到此错误消息 错误 声明隐藏了全局范围内的变量 无效迭代器 节点 根 我不明白我到底在哪里隐藏或隐藏了之前声明的全局变量 我怎样才能解决这个问题 typedef node typedef struct node
  • C# 用数组封送结构体

    假设我有一个类似于 public struct MyStruct public float a 我想用一些自定义数组大小实例化一个这样的结构 在本例中假设为 2 然后我将其封送到字节数组中 MyStruct s new MyStruct s
  • 在 ASP.Net Core 2.0 中导出到 Excel

    我曾经使用下面的代码在 ASP NET MVC 中将数据导出到 Excel Response AppendHeader content disposition attachment filename ExportedHtml xls Res
  • 我的 strlcpy 版本

    海湾合作委员会 4 4 4 c89 我的程序做了很多字符串处理 我不想使用 strncpy 因为它不会终止 我不能使用 strlcpy 因为它不可移植 只是几个问题 我怎样才能让我的函数正常运行 以确保它完全安全稳定 单元测试 这对于生产来
  • 更改窗口的内容 (WPF)

    我创建了一个简单的 WPF 应用程序 它有两个 Windows 用户在第一个窗口中填写一些信息 然后单击 确定 这会将他们带到第二个窗口 这工作正常 但我试图将两个窗口合并到一个窗口中 这样只是内容发生了变化 我设法找到了这个更改窗口内容时
  • 可空属性与可空局部变量

    我对以下行为感到困惑Nullable types class TestClass public int value 0 TestClass test new TestClass Now Nullable GetUnderlyingType
  • 什么是 C 语言的高效工作流程? - Makefile + bash脚本

    我正在开发我的第一个项目 该项目将跨越多个 C 文件 对于我的前几个练习程序 我只是在中编写了我的代码main c并使用编译gcc main c o main 当我学习时 这对我有用 现在 我正在独自开展一个更大的项目 我想继续自己进行编译
  • 在 URL 中发送之前对特殊字符进行百分比编码

    我需要传递特殊字符 如 等 Facebook Twitter 和此类社交网站的 URL 为此 我将这些字符替换为 URL 转义码 return valToEncode Replace 21 Replace 23 Replace 24 Rep
  • 如何在内存中存储分子?

    我想将分子存储在内存中 这些可以是简单的分子 Methane CH4 C H bond length 108 7 pm H H angle 109 degrees But also more complex molecules like p
  • ListDictionary 类是否有通用替代方案?

    我正在查看一些示例代码 其中他们使用了ListDictionary对象来存储少量数据 大约 5 10 个对象左右 但这个数字可能会随着时间的推移而改变 我使用此类的唯一问题是 与我所做的其他所有事情不同 它不是通用的 这意味着 如果我在这里
  • 在Linux中使用C/C++获取机器序列号和CPU ID

    在Linux系统中如何获取机器序列号和CPU ID 示例代码受到高度赞赏 Here http lxr linux no linux v2 6 39 arch x86 include asm processor h L173Linux 内核似
  • 在 ASP.NET 中将事件冒泡为父级

    我已经说过 ASP NET 中的层次结构 page user control 1 user control 2 control 3 我想要做的是 当控件 3 它可以是任何类型的控件 我一般都想这样做 让用户用它做一些触发回发的事情时 它会向
  • 将 viewbag 从操作控制器传递到部分视图

    我有一个带有部分视图的 mvc 视图 控制器中有一个 ActionResult 方法 它将返回 PartialView 因此 我需要将 ViewBag 数据从 ActionResult 方法传递到 Partial View 这是我的控制器
  • 为什么 strtok 会导致分段错误?

    为什么下面的代码给出了Seg 最后一行有问题吗 char m ReadName printf nRead String s n m Writes OK char token token strtok m 如前所述 读取字符串打印没有问题 但

随机推荐

  • 如何使 UITextView 布局文本与 UILabel 相同?

    我有一个UILabel我需要将其转换为UITextView因为原因 当我这样做时 尽管使用相同的 自定义 字体 但文本的位置并不相同 我发现如果我设置 textView textContainer lineFragmentPadding 0
  • JSON:序列化 Guava 可选

    com google common base Optional 是否有 Json 序列化器 反序列化器 开箱即用的这似乎不适用于杰克逊 见下文 package com example import java io IOException i
  • 对象没有方法 getColumnType 错误

    我已阅读解决方案this https stackoverflow com questions 11376665 object has no method getcolumntype帖子但似乎不适合我的问题 我正在使用谷歌图表来构建折线图 x
  • 如何将子实体映射到父实体而不在子实体中引入原始类型父链接器?

    我有这些课程 public class Product Key public virtual int ProductId get set public virtual string ProductName get set public vi
  • 如何找到 Chef 菜谱中可用的磁盘?

    当 Chef 配方正在执行时 我想确定是否有足够的可用磁盘空间来执行操作 如何最好地做到这一点 Ohai http docs opscode com ohai html每次运行时都会检测节点的某些属性 这些属性被捕获为自动属性 http d
  • 如何以编程方式设置“以管理员身份运行此程序”

    我在 Vista 中使用 bdeadmin exe 时遇到问题 首先 让我们排除可预测的响应 你不应该要求提升你的申请 这个可以 这就是生活 您需要嵌入一个清单文件 它已经编译完毕 已经有很多年历史了 创建它的公司无意再次这样做 并且它是从
  • 为什么 onActivityResult 在 Activity 开始之前就被触发?

    我有一个应用程序需要扫描条形码以获取代码才能继续 我使用此代码来启动扫描活动 finish Button findViewById R id finishButton finish setOnClickListener new OnClic
  • 如何使用 jQuery 将正则表达式应用于输入?

    我有此代码强制用户在输入中仅输入数字 Day keyup function var test new RegExp D G if test test Day val Day val replace D G 但它让我输入非数字并且控制台中没有
  • 在 DataGrip 中定义 Redshift 连接

    我尝试在 DataGrip 中定义 Redshift 连接 但在 UI 中找不到任何 Redshift 驱动程序 我尝试使用 Postgres 和通用数据库驱动程序 但没有成功 有人能够配置这个吗 如果您想将 DataGrip 连接到 Re
  • GMAIL 中具有非 HTTP 架构的超链接

    因此 我正在制作移动应用程序 并希望使用相同的 URL 制作链接来激活 iOS 和 Android 中的内容 我已经知道该怎么做了 我对 Android 的意图是这样的
  • 如何在子菜单上使用滚动条时显示子菜单?

    当我有滚动条时 我的子菜单不会显示 我正在使用引导程序 这是我的html代码 a href Location a ul class dropdown menu scrollable menu li class dropdown submen
  • 如何调试eclipse插件的启动?

    我尝试将 Eclipse 插件从 Java8 迁移到 Java9 如果我启动调试会话 作为 Eclipse 应用程序运行 一切正常 但是 安装插件后我无法使用它 如果我在 OSGI 控制台中使用 ss 我的插件会得到以下状态 1102 ST
  • 使用正则表达式生成字符串而不是匹配它们[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在编写一个 Java 实用程序 可以帮助我生成大量数据以进行性能测试 这将是really能够为字符串
  • 发现存储特定面向对象数据结构的最佳方法

    经过一些奇妙的建议 以及由于最终有可能解决我的问题而兴奋的不眠之夜 我意识到我仍然没有完全找到解决方案 因此 我在这里更详细地概述我的问题 希望有人知道实现这一目标的最佳方法 回顾一下 如果你还没有读过上一篇文章 https stackov
  • 快速 count() 两个字符串数组的交集

    我需要计算两个大字符串数组的交集对应的元素数量 并且速度非常快 我正在使用以下代码 arr1 i Intersect arr2 j Count 对于 CPU 时间 VS Profiler 指示 85 1 在System Linq Enume
  • Redis扫描跳过键

    我正在使用 predis 如果有什么区别的话 可以使用 laravel php 客户端来与 Redis 一起工作 我需要从 Redis 获取与特定前缀匹配的所有键 我这样做 keys foreach new Iterator Keyspac
  • 我可以关闭 Kramdown 中的代码块吗?

    我可以关闭 Jekyll 中的代码块吗 它将使我的 md 文件更具可读性 我在内联 HTML 和包含文件中都遇到这个问题 我使用 Jekyll 创建网站 从不需要代码块 现在我将样式放入 HTML 中 如下所示 div class cool
  • Angular 5 + Angular Material Select + Reactive Forms == 没有显示初始选项

    正如标题所说 我有一个反应形式 有多个
  • 这个命令在 bash 中起什么作用: ,_,( ){ ,_,| ,_,&};,_,

    我不确定这意味着什么 看起来像 bash 命令 但它可能是 bash shell 指令或其他东西 如果有人可以帮助理解这一点 我将不胜感激 当我运行它时它杀死了我的bash It s a 叉子炸弹 http en wikipedia org
  • C++ 和 C 可变参数如何一起使用?

    通常 将 C 11 可变参数模板功能与函数一起使用需要基于可变参数的函数参数位于函数参数列表中的最后一个 有一个例外 如果存在 C 级可变参数 它们是倒数第二个参数 这必须是最后一个 template lt typename Args gt