C++:宏可以将“abc”扩展为“a”、“b”、“c”吗?

2023-11-22

我编写了一个可变参数模板,它接受可变数量的char参数,即

template <char... Chars>
struct Foo;

我只是想知道是否有任何宏技巧可以让我使用类似于以下的语法实例化它:

Foo<"abc">

or

Foo<SOME_MACRO("abc")>

or

Foo<SOME_MACRO(abc)>

etc.

基本上,任何阻止你单独写字符的东西,就像这样

Foo<'a', 'b', 'c'>

这对我来说不是一个大问题,因为它只是一个玩具程序,但我想我还是会问。


我今天创建了一个,并在 GCC4.6.0 上进行了测试。

#include <iostream>

#define E(L,I) \
  (I < sizeof(L)) ? L[I] : 0

#define STR(X, L)                                                       \
  typename Expand<X,                                                    \
                  cstring<E(L,0),E(L,1),E(L,2),E(L,3),E(L,4), E(L,5),   \
                          E(L,6),E(L,7),E(L,8),E(L,9),E(L,10), E(L,11), \
                          E(L,12),E(L,13),E(L,14),E(L,15),E(L,16), E(L,17)> \
                  cstring<>, sizeof L-1>::type

#define CSTR(L) STR(cstring, L)

template<char ...C> struct cstring { };

template<template<char...> class P, typename S, typename R, int N>
struct Expand;

template<template<char...> class P, char S1, char ...S, char ...R, int N>
struct Expand<P, cstring<S1, S...>, cstring<R...>, N> :
  Expand<P, cstring<S...>, cstring<R..., S1>, N-1>{ };

template<template<char...> class P, char S1, char ...S, char ...R>
struct Expand<P, cstring<S1, S...>, cstring<R...>, 0> {
  typedef P<R...> type;
};

一些测试

template<char ...S> 
struct Test {
  static void print() {
    char x[] = { S... };
    std::cout << sizeof...(S) << std::endl;
    std::cout << x << std::endl;
  }
};

template<char ...C>
void process(cstring<C...>) {
  /* process C, possibly at compile time */
}

int main() {
  typedef STR(Test, "Hello folks") type;
  type::print();

  process(CSTR("Hi guys")());
}

所以虽然你没有得到'a', 'b', 'c',您仍然可以获得编译时字符串。

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

C++:宏可以将“abc”扩展为“a”、“b”、“c”吗? 的相关文章

随机推荐

  • 错误:自动模块无法与 jlink 一起使用: - Maven 与 JavaFX

    我通过 Maven 存储库选择了 Apache Commons IO JSerialComm 和 Ini4J 库 但是当我尝试通过创建图像时mvn javafx jlink我收到此错误 INFO javafx maven plugin 0
  • 使用汇编语言进行 128 位移位?

    在现代 Intel CPU 酷睿 i7 sandybridge 上进行 128 位移位的最有效方法是什么 类似的代码在我最内层的循环中 u128 a N void xor for int i 0 i lt N i a i a i a i g
  • 创建具有多个表的 rdlc 报告(一对多关系)

    所以 我是 rdlc 的新手 实际上也是一般报告 我有一个表与另一个表具有一对多关系 并且我试图在 rdlc 报告中将它们表示为多个表对于每个项目 注意 这些表最初是使用实体框架代码优先创建的 这是两个表 以及父级 现在 通常如果我只有 Q
  • WPF XAML 中的 My.Resources?

    有没有办法通过 Xaml 访问 My Resources 像这样
  • 在 List 上对 Datagridview 数据源进行排序,其中 T 是匿名的

    一个比较简单的问题 我有一个 datagridview 它所做的只是显示统计信息 没有行的编辑 添加 删除 datagridview 绑定到一个列表 我想要实现的只是让用户能够对列进行排序 class Market public int L
  • for-in JavaScript 语句中的 IE8 错误?

    我想我在 IE IE8 处理 for in javascript 语句时发现了一个错误 经过几个小时将其归结为一个小示例后 看起来 IE 专门跳过了 for in 循环中名为 toString 的任何属性 无论它是在原型中还是对象的 自己的
  • MVC4 Action 返回不带 null 的 JsonResult

    我有一个为特定类的对象返回 JsonResult 的操作 我用一些属性装饰了这个类的属性以避免空字段 类的定义是 private class GanttEvent public String name get set JsonPropert
  • 如何使用 Python ElementTree 创建

    我尝试使用这个问题的答案 但无法使其工作 如何用Python的ElementTree创建 虚拟根 这是我的代码 import xml etree cElementTree as ElementTree from StringIO impor
  • 如何在 Laravel 中对对象数组进行分页?

    我正在使用 Laravel 4 2 构建一个应用程序 我有一个模型units另一个用于users和数据透视表user units 该应用程序中的每个用户都可以选择一个单元并将其添加到他最喜欢的列表中 然后他可以将该单元及其信息作为广告发布
  • 以编程方式获取 DLL 的版本号

    是否可以通过编程方式从任何 NET DLL 获取版本号 如果是 怎么办 如果 dll 是这样的话 这有效 net or Win32 仅当 dll 为 net 时 反射方法才有效 另外 如果使用反射 则需要将整个 dll 加载到内存中 以下方
  • 如何使用 C# 检查程序安装位置

    我需要通过程序名称 出现在 添加或删除程序 中的名称 检查程序的安装位置 使它适用于所有语言的最佳方法是什么 查看注册表 HKEY LOCAL MACHINE SOFTWARE Microsoft Windows CurrentVersio
  • 无法在c#中运行Google Cloud PubSub,DLL问题

    我正在努力将 Google Cloud PubSub 集成到我的 c 项目中 我使用 NuGet 进行安装1 0 0 beta11 完全没有错误 当我运行我的项目并到达使用 pubsub 的代码时 出现以下错误 An unhandled e
  • 使用 firestore 进行多查询和分页

    我正在尝试使用 firestore 实现多查询和分页 但是一旦我将 添加到查询中 光标就不起作用 working example the doc id i save as propery on the doc ref where categ
  • 跨平台命令行脚本(例如.bat和.sh)

    我注意到 Windows 7 可以像执行 bat 文件一样执行 sh 文件 这让我想知道是否可以编写一个 sh 文件以便可以在 Windows 中执行andLinux 比如说bash 我首先想到的是编写一个 if 语句 以便 Windows
  • 建造者设计模式和工厂设计模式有什么区别? [关闭]

    Closed 这个问题需要多问focused 目前不接受答案 Builder设计模式和Factory设计模式有什么区别 哪一种更有优势 为什么 如果我想测试和比较 对比这些模式 如何将我的发现表示为图表 对于设计模式 通常没有适用于所有情况
  • Sn.exe 中自动输入密码

    我需要创建构建后事件来执行以下操作 sn i MyKey pfx MyKeyContainerName tlbimp ConfigurationName MyCom tlb out ConfigurationName NETMyCom dl
  • 我应该如何表示带有附加信息注释的 AST?

    假设我有一个用某种语言表示 AST 的简单数据类型 data Term Var String Num Integer Expr Term 实际上 它显然会有比这更多的构造函数 我可以用它来编写一个与 AST 结构匹配的简单评估函数 eval
  • 列出窗口对象的所有属性?

    我希望 动态 获取浏览器当前识别的 HTML 元素列表 例如HTMLPreElement HTMLSpanElement等等 这些对象是全局的 即 console log HTMLPreElement in window gt true 所
  • WOFF 字体,它们是什么以及我为什么要关心?

    所以 Mozilla 提出了一种新的网络字体 我不太喜欢那个世界 但我想让自己保持最新状态 那么 既然连微软都支持它 那么伟大的事情是什么 为什么我作为一个网络开发者应该关心呢 和旧的有什么区别 我们需要另一个字体系统吗 什么情况下应该使用
  • C++:宏可以将“abc”扩展为“a”、“b”、“c”吗?

    我编写了一个可变参数模板 它接受可变数量的char参数 即 template