具有零参数和逗号的可变参数宏

2023-11-23

考虑这个宏:

#define MAKE_TEMPLATE(...) template <typename T, __VA_ARGS__ >

当与零参数一起使用时,它会产生错误的代码,因为编译器期望逗号后面有一个标识符。实际上,VC 的预处理器足够聪明,可以删除逗号,但 GCC 的则不然。 由于宏不能重载,因此对于这种特殊情况似乎需要一个单独的宏才能正确实现,如下所示:

#define MAKE_TEMPLATE_Z() template <typename T>

有什么方法可以让它在不引入第二个宏的情况下工作吗?


不,因为宏调用MAKE_TEMPLATE()根本没有零参数;它有一个由零个标记组成的参数。

较旧的预处理器(显然包括最初编写此答案时的 GCC)有时会如您所希望地解释一个空参数列表,但共识已转向更严格、更窄的扩展,更符合标准。

要使下面的答案起作用,请在省略号之前定义一个附加宏参数:

   #define MAKE_TEMPLATE(UNUSED, ...) template <typename T, ## __VA_ARGS__ >

然后当列表不为空时,始终在第一个参数之前添加逗号:

   MAKE_TEMPLATE(, foo )

旧答案

根据http://gcc.gnu.org/onlinedocs/gcc/Variadic-Macros.html,GCC确实支持这一点,只是不透明。

语法是:

   #define MAKE_TEMPLATE(...) template <typename T, ## __VA_ARGS__ >

不管怎样,两者都支持 C++0x 模式下的可变模板,这是更可取的。

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

具有零参数和逗号的可变参数宏 的相关文章

  • C# 异步等待澄清?

    我读了here http blog stephencleary com 2012 02 async and await html that 等待检查等待的看看它是否有already完全的 如果 可等待已经完成 那么该方法将继续 运行 同步
  • 根据属性的类型使用文本框或复选框

    如果我有这样的结构 public class Parent public string Name get set public List
  • 机器Epsilon精度差异

    我正在尝试计算 C 中双精度数和浮点数的机器 epsilon 值 作为学校作业的一部分 我在 Windows 7 64 位中使用 Cygwin 代码如下 include
  • 如何从 Visual Studio 将视图导航到其控制器?

    问题是解决方案资源管理器上有 29 个项目 而且项目同时具有 ASP NET MVC 和 ASP NET Web 表单结构 在MVC部分中 Controller文件夹中有大约100个子文件夹 每个文件夹至少有3 4个控制器 视图完全位于不同
  • 传递给函数时多维数组的指针类型是什么? [复制]

    这个问题在这里已经有答案了 我在大学课堂上学习了 C 语言和指针 除了多维数组和指针之间的相似性之外 我认为我已经很好地掌握了这个概念 我认为由于所有数组 甚至多维 都存储在连续内存中 因此您可以安全地将其转换为int 假设给定的数组是in
  • 如何从本机 C(++) DLL 调用 .NET (C#) 代码?

    我有一个 C app exe 和一个 C my dll my dll NET 项目链接到本机 C DLL mynat dll 外部 C DLL 接口 并且从 C 调用 C DLL 可以正常工作 通过使用 DllImport mynat dl
  • 如何连接重叠的圆圈?

    我想在视觉上连接两个重叠的圆圈 以便 becomes 我已经有部分圆的方法 但现在我需要知道每个圆的重叠角度有多大 但我不知道该怎么做 有人有主意吗 Phi ArcTan Sqrt 4 R 2 d 2 d HTH Edit 对于两个不同的半
  • 如何在 C++ 中标记字符串?

    Java有一个方便的分割方法 String str The quick brown fox String results str split 在 C 中是否有一种简单的方法可以做到这一点 The 增强分词器 http www boost o
  • 用于 FTP 的文件系统观察器

    我怎样才能实现FileSystemWatcherFTP 位置 在 C 中 这个想法是 每当 FTP 位置添加任何内容时 我都希望将其复制到我的本地计算机 任何想法都会有所帮助 这是我之前问题的后续使用 NET 进行选择性 FTP 下载 ht
  • C++ 多行字符串原始文字[重复]

    这个问题在这里已经有答案了 我们可以像这样定义一个多行字符串 const char text1 part 1 part 2 part 3 part 4 const char text2 part 1 part 2 part 3 part 4
  • 方程“a + bx = c + dy”的积分解

    在等式中a bx c dy 所有变量都是整数 a b c and d是已知的 我如何找到整体解决方案x and y 如果我的想法是正确的 将会有无限多个解 由最小公倍数分隔b and d 但我只需要一个解决方案 我可以计算其余的 这是一个例
  • x:将 ViewModel 方法绑定到 DataTemplate 内的事件

    我基本上问同样的问题这个人 https stackoverflow com questions 10752448 binding to viewmodels property from a template 但在较新的背景下x Bind V
  • C# 动态/expando 对象的深度/嵌套/递归合并

    我需要在 C 中 合并 2 个动态对象 我在 stackexchange 上找到的所有内容仅涵盖非递归合并 但我正在寻找能够进行递归或深度合并的东西 非常类似于jQuery 的 extend obj1 obj2 http api jquer
  • 如何在 Android 中使用 C# 生成的 RSA 公钥?

    我想在无法假定 HTTPS 可用的情况下确保 Android 应用程序和 C ASP NET 服务器之间的消息隐私 我想使用 RSA 来加密 Android 设备首次联系服务器时传输的对称密钥 RSA密钥对已在服务器上生成 私钥保存在服务器
  • 编译时展开 for 循环内的模板参数?

    维基百科 here http en wikipedia org wiki Template metaprogramming Compile time code optimization 给出了 for 循环的编译时展开 我想知道我们是否可以
  • 在 WPF 中使用 ReactiveUI 提供长时间运行命令反馈的正确方法

    我有一个 C WPF NET 4 5 应用程序 用户将用它来打开某些文件 然后 应用程序将经历很多动作 读取文件 通过许多插件和解析器传递它 这些文件可能相当大 gt 100MB 因此这可能需要一段时间 我想让用户了解 UI 中发生的情况
  • C++ 继承的内存布局

    如果我有两个类 一个类继承另一个类 并且子类仅包含函数 那么这两个类的内存布局是否相同 e g class Base int a b c class Derived public Base only functions 我读过编译器无法对数
  • C++ 中的 include 和 using 命名空间

    用于使用cout 我需要指定两者 include
  • C++ 中的参考文献

    我偶尔会在 StackOverflow 上看到代码 询问一些涉及函数的重载歧义 例如 void foo int param 我的问题是 为什么会出现这种情况 或者更确切地说 你什么时候会有 对参考的参考 这与普通的旧参考有何不同 我从未在现
  • 使用 WGL 创建现代 OpenGL 上下文?

    我正在尝试使用 Windows 函数创建 OpenGL 上下文 现代版本 基本上代码就是 创建窗口类 注册班级 创建一个窗口 choose PIXELFORMATDESCRIPTOR并设置它 创建旧版 OpenGL 上下文 使上下文成为当前

随机推荐

  • 如何在 IntelliJ IDEA 中复制 JSON 中的路径?

    是否可以复制 JSON 文件中的路径 例如在这个文件中 a b c keyC 当我在 keyC 我会按一些热键 我会得到一个a b c剪贴板中的字符串 我知道这篇文章很旧 但我想我会给出更新的答案 我遇到这个问题是因为我正在寻找同样的东西
  • Apple 的 APNS 传输有时很慢

    使用我们自己的内置 APNS 推送系统 用 PHP 编写 我们可以在某些事件上推送到我们的设备 设备会立即收到某些通知 而某些设备可能需要长达 15 分钟才能看到 我们保持连接打开 按照 Apple 的要求 并根据记录的错误重置连接 通常是
  • 使用 sc.textFile() 加载本地文件到 Spark

    Question 如何使用 sc textFile 将文件从本地文件系统加载到 Spark 我需要改变什么吗 env变量 另外 当我在未安装 Hadoop 的 Windows 上尝试相同的操作时 我遇到了相同的错误 Code gt val
  • 需要Windows CE 5.0模拟器

    我需要一个 Windows CE 5 0 模拟器来测试我正在开发的嵌入式设备 不是 PDA 或智能手机 应用程序 这是我已经尝试过的 Visual Studio 2008 Pro 包含一个模拟器 不幸的是 它不包括 Windows CE 映
  • 将 Delphi 应用程序转换为作为服务运行 - 有必要吗?

    我有一个 delphi 应用程序 它记录来自不同位置的数据并将数据写入文件 该应用程序有一个相当广泛的 GUI 可以显示数据 配置选项等 一位用户请求将该应用程序更改为可以作为服务运行 他的理由是 该应用程序可以在启动时启动并在没有任何用户
  • 如何在 MVC 视图中显示对象列表?

    我有一个返回字符串列表的方法 我只是想在视图中以纯文本形式显示该列表 这是来自控制器的列表 public class ServiceController Controller public string Service Some code
  • Flutter resizeToAvoidBottomInset true 不适用于 Expanded ListView

    键盘隐藏了我的ListView 分组列表视图 我认为这是因为Expanded Widget My body Column children Expanded child Padding padding const EdgeInsets al
  • 如何打印_r $_POST 数组?

    我有下表
  • mysql 左外连接

    我有两张桌子 employee包含字段employee id 名字 中间名 姓氏 timecard包含字段employee id 入职时间 超时 tc date transaction 我想选择具有与考勤卡相同的employee id 且日
  • 在 PostgreSQL 中生成两个日期之间的时间序列

    我有一个这样的查询 可以很好地生成两个给定日期之间的一系列日期 select date 2004 03 07 j i as AllDate from generate series 0 extract doy from date 2004
  • 如何使用 Google Test 捕获分段错误?

    如何测试函数不会产生分段错误 这是我现在所知道的 我可以做的 EXPECT DEATH foo nullParameter 在函数内部 会产生分段错误 这是我想要失败的行为 上面的代码片段将使测试通过 因为这是预期的 进程的死亡 现在 我怎
  • 打包 APK 时出现错误:: 重复文件

    安卓工作室 我在应用程序运行期间遇到此类错误 Error Execution failed for task app packageDebug Duplicate files copied in APK META INF notice tx
  • SSRS 格式显示为百分比

    我已经在这里举了很多例子 如果我问重复的问题 我很抱歉 据我所知 我不是 我制作了一份 SSRS 报告 显示了我们销售部门某些方面的总销售额 它们按行细分 按 成本 毛利润 毛利润百分比 订单数 总销售额 这些栏目是我们销售的方面 网络销售
  • Android 处理程序定期

    这是我想要实现的目标 活动开始时没有 ClickListener 并且有四个文本视图 全部为白色背景 我想将 textview 1 的颜色更改为蓝色 等待 2 秒 然后将其改回白色 并将 textview 2 更改为蓝色 等待 2 秒 然后
  • 为什么我要费心使用 Task.ConfigureAwait(continueOnCapturedContext: false);

    考虑以下 Windows 窗体代码 private async void UpdateUIControlClicked object sender EventArgs e this txtUIControl Text I will be u
  • 最快的 JavaScript 求和

    在 JavaScript 中对数组求和的最快方法是什么 快速搜索翻了几种不同的方法 但如果可能的话我想要一个本机解决方案 这将在 SpiderMonkey 下运行 我一直在使用的非常内化的思维 var count 0 for var i 0
  • flutter:检查对象是否已存在于列表中

    我有以下代码 class FavoriteItem String headline String content String link String publisheddate FavoriteItem this headline thi
  • 不区分大小写 std::string.find()

    我在用std string s find 方法来测试一个字符串是否是另一个字符串的子字符串 现在我需要相同内容的不区分大小写的版本 对于字符串比较 我总是可以转向stricmp 但似乎没有stristr 我找到了各种答案 大多数建议使用Bo
  • 我可以使用 cerr 吗

    在下面描述的情况下使用 cerr 的风格是否良好 try cout lt lt a b catch const IntException e cerr lt lt Exception caught lt lt typeid e name u
  • 具有零参数和逗号的可变参数宏

    考虑这个宏 define MAKE TEMPLATE template