获取表达式类型的宏

2024-06-29

Question

我正在尝试编写一个 C++ 宏,它需要type or type name作为输入,并给出type作为输出。

例如:
REMOVE_NAME(int)应该int
REMOVE_NAME(int aNumber)也应该是int

我设法编写了这样一个宏(如下)并且它有效,但我想知道我是否缺少一种更简单的方法来完成此任务。

#include <boost/type_traits.hpp>

template <typename T>
struct RemoveNameVoidHelper
{
    typedef typename T::arg1_type type;
};

template <>
struct RemoveNameVoidHelper<boost::function_traits<void()>>
{
    typedef void type;
};

#define REMOVE_NAME(expr) RemoveNameVoidHelper<boost::function_traits<void(expr)>>::type

有任何想法吗?

动机

我正在使用这个宏来帮助代码生成。我有另一个宏,用于在类定义中声明某些方法:

#define SLOT(name, type)                            \
    void Slot##name(REMOVE_NAME(type) argument)     \
    {                                               \
        /* Something that uses the argument. */     \
    }                                               \
    void name(type)

我想要的用户SLOT宏能够轻松地选择是否要在类内部或外部实现他的插槽,就像使用普通方法一样。这意味着SLOT的类型参数可以是类型,也可以是带有名称的类型。例如:

class SomeClass
{
    SLOT(ImplementedElsewhere, int);
    SLOT(ImplementedHere, int aNumber)
    {
        /* Something that uses aNumber. */
    }
};

如果没有REMOVE_NAME宏,我自动生成的Slot...方法将无法为其参数指定自己的名称,因此无法引用它。

当然,这并不是该宏的唯一可能用途。


我认为你是对的;据我所知,唯一的其他作品声明说明符序列 or 类型说明符序列后面跟着一个可选的声明者 is a catch声明,我认为这对于类型提取没有多大用处。生产参数声明也用于模板参数列表,但这也没有多大用处。

我可能会像这样定义你的宏,消除对 Boost 的依赖:

template<typename T> struct remove_name_helper {};
template<typename T> struct remove_name_helper<void(T)> { typedef T type; };
template<> struct remove_name_helper<void()> { typedef void type; };

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

获取表达式类型的宏 的相关文章

  • 如何在不缓冲的情况下从 WCF 流式传输响应?

    我有一个宁静的 webHttpBinding 自托管WCF服务 大多数方法都会向客户端返回 xml 或 json 版本的对象 我有几个触发长时间运行的方法的 GET 方法 我想将日志响应流式传输到浏览器 或应用程序 以便用户知道发生了什么
  • C++:空类的对象的大小是多少?

    我想知道可能是什么空类对象的大小 肯定可以not为 0 字节 因为它应该可以像任何其他对象一样引用和指向它 但是 这样的物体有多大呢 我用了这个小程序 include
  • 提高mmap memcpy文件读取性能

    我有一个从文件中顺序读取数据的应用程序 有些是直接从指向的指针读取mmaped 文件和其他部分是memcpyed 从文件到另一个缓冲区 我注意到在进行大型操作时性能不佳memcpy我需要的所有内存 1MB 块 以及在执行大量较小操作时的更好
  • 如何终止从cin读取?

    我已经尝试了这里列出的一堆方法 但没有一个起作用 它总是在等待更多的输入 我试过了while std getline std cin line 和下面的方法 似乎没有任何作用 include
  • 在简单/未命名的 C# LINQ 组连接中排序内部密钥源

    我知道这个问题由于用词不同而读起来很奇怪 但这是使用的术语这个 MSDN 页面 http msdn microsoft com en us library bb311040 aspx从我正在学习 LINQ 组的地方开始 我将解释它们 我正在
  • IE7 中的多个选项卡和一个工具栏实例

    我用 C 开发了一个用于 Internet Explorer 的工具栏 用于从外部应用程序发送和接收 URL 它在 IE6 中运行得很好 但我想在新版本 IE7 中利用选项卡式浏览 但我在那里遇到了障碍 似乎在 IE7 中 每个选项卡都有一
  • WTL 子窗口事件处理

    我正在开发窗口应用程序 因为我在左侧和右侧有 2 个子窗口 我想分别处理两个窗口的输入事件 如何实现 My code class EditorWindow public DxWindow public CSplitterWindow m v
  • ASP.NET身份更改密码

    我需要能够由管理员更改用户密码 因此 管理员不应输入用户的当前密码 他应该能够设置新密码 我查看了 ChangePasswordAsync 方法 但该方法需要输入旧密码 因此 此方法不适合此任务 因此我通过以下方式做到了 HttpPost
  • x64 DLL 导出函数名称

    我正在尝试将 32 位 dll 和应用程序 移植到 64 位 并且我成功地构建了它而没有错误 当尝试使用我的 64 位应用程序加载它时 我注意到导出的函数名称不同 这就是我导出函数的方式 ifdef cplusplus extern C e
  • 字符集中字符的顺序

    是否通过标准保证字符的顺序 例如 我可以算出字符集表中 1 符号后面跟着 2 符号吗 或者它是特定于平台的 1999 年的 C 标准对字符集是这样规定的 基本源字符集和基本执行字符集都应具有以下成员 拉丁字母表中的 26 个大写字母 拉丁字
  • C 中的 const 和指针

    将 const 与指针一起使用可能会导致指针对象无法通过使用相关指针取消引用来修改 但为什么我也不能修改指针不直接指向的内容呢 例如 int a 3 const int ptr a ptr 5 不会编译 但为什么 ptr 2 5 还编译不了
  • 从 C# 运行多个 python 脚本

    我希望有人能够在这里帮助我 我对 C 比较陌生 正在尝试执行我在 C winform 应用程序中编写的一些 Python 代码 我想做的是从 winform 中的文本框中输入名称 并让它通过 python 脚本进行处理 并在 winform
  • SQL:使用 1 个查询更新一行并返回列值

    我需要更新表中的一行 并从中获取列值 我可以这样做 UPDATE Items SET Clicks Clicks 1 WHERE Id Id SELECT Name FROM Items WHERE Id Id 这会生成 2 个对该表的计划
  • .NET 垃圾收集行为(使用 DataTable 对象)

    我想知道为什么在创建一个非常简单的 DataTable 并将其设置为 null 后 垃圾收集不会清除该 DataTable 使用的所有内存 这是一个例子 变量 Before 应等于 Removed 但事实并非如此 long Before 0
  • 无法从 GetSystemTime() 获取毫秒

    我正在尝试打印秒和毫秒分辨率计时 我正在使用GetSystemTime 这是我的代码 GetSystemTime datetime RETAILMSG 1 T Time After Data Sent to USB d d r n date
  • 如何在网络浏览器中打开 Excel?

    单击按钮时我需要在网络浏览器中打开 Excel 如何在 asp net 中执行此操作 您无法在客户端 浏览器 计算机上控制和启动软件 为什么 安全 如果这是可能的话 黑客早就接管了所有计算机 你能解释一下吗exactly你想做什么 如果您解
  • 如何在Azure函数应用程序中调用函数后动态更改内容

    我正在使用 Visual Studio 2019 使用 Azure function v3 0 开发 Azure function 应用程序 我实现了一个时间触发的功能 我想更改内容 时间表 function json function j
  • 同一个盒子上的进程间通信 - 2 个应用程序或进程之间的通信

    在同一机器上的应用程序之间实现进程间通信的最佳方法是什么 两者都是用 C 编写的 管理器应用程序将向其他应用程序发送命令 例如 停止 启动 它还将监视应用程序并可能要求提供数据 所有应用程序都将在同一台运行 Windows 7 操作系统的计
  • 使用脚本取消设置 PDF 字体

    我正在使用 xhtml2pdf 库自动创建 PDF 几个月前我有过这个问题 https stackoverflow com questions 25203219 xhtml2pdf doesnt embed helvetica 库嵌入了我没
  • 配置 SourceTrail 以接受带有 @ 语法的嵌入式 c/c++ 头文件

    我正在尝试使用 Sourcetrail https www sourcetrail com https www sourcetrail com 快速了解 pic18 系列微控制器的一些旧嵌入式 c c 源代码 导入硬件包含文件时出现错误 该

随机推荐

  • Vue 表 2 - 自定义过滤器

    我正在尝试使用这个https github com matfish2 vue tables 2 https github com matfish2 vue tables 2使用 Vue 2 1 8 它工作得很好 但我需要使用自定义过滤器根据
  • AWS EC2 实例调度器轻松实现

    我正在使用ec2进行开发 下班后浪费钱 创建一个每天早上 8 点自动启动 晚上 7 点结束的调度程序需要多少时间 我看过AWS提供的指南 但是有点困难 https aws amazon com ko answers infrastruct
  • 在 EF Core 中应用所有 IEntityTypeConfiguration 派生类

    有谁知道一种方法或有一个实现来应用派生自的所有类IEntityTypeConfiguration lt gt to the DbContext在运行时 似乎没有内置任何东西 需要通过以下方式手动加载每一个 protected overrid
  • protobuf-net 代码生成器

    我正在将 Google Proto Buffers 合并到我的项目中 Windows 的 protoc exe 生成用于序列化 反序列化的头文件和源文件的方式非常好 我需要 protobuf net 代码生成器 因此 例如 如果我有一个 P
  • 如何在 Zend 框架中检查完整的错误日志?

    我是采埃孚的新手 这是我的第一次测试 我正进入 状态 发生错误 发生错误 我的错误 phtml 是 h1 An error occurred h1 h2 h2 h3 Exception information h3 p b Message
  • 找不到模块:错误:与 webpack 捆绑时无法解析模块“模块”mongodb

    当我尝试在节点应用程序中使用 mongoose connect 时 Webpack 抛出以下错误 最初还有一些错误 例如 Module not found Error Cannot resolve module fs 在我的 webpack
  • 如何在没有服务器的情况下通过套接字连接两个Android设备

    我正在尝试开发一个Android应用程序 它可以在没有服务器的情况下与其他设备进行点对点连接交换数据 所以请建议我该怎么做 先感谢您 这是一个无需服务器的 SocketProgramming 聊天的完整代码 在我的应用程序中 首先您是客户端
  • ASP.NET MVC 4 - 使用post方法

    在 Visual Studio 2010 中 我使用 ASP NET MVC 4 创建 Web api 项目 如本示例所示 https www youtube com watch v H9vBxAH4f5E https www youtub
  • ÅäÖ:什么被认为是对 SEO 更友好的 URL

    据我所知 我不应该使用 比如它们在 ASCII 中没有视觉表示 那么什么被认为对 SEO 更友好呢 将所有 替换为 a 或 ae CMS Umbraco 替换为 ae 我倾向于这个 编辑 一些瑞典网站如何做到这一点的总结 aftonblad
  • ASIHTTPRequest 登录页面

    我尝试制作一个 iPhone 应用程序 可以登录到使用 https 保护用户信息的 Web 应用程序 现在我陷入了登录页面 我不知道通过我的应用程序登录时如何检查用户网站中的真实帐户 即使我输入错误的帐户 我也只收到 200 的回复 这是我
  • 命令行参数出现空格的问题

    我有一个 Java 程序 我正在 Linux 环境中通过 bash 脚本执行该程序 这是我的简单 bash 脚本 它接受一个字符串 bin bash java cp com QuoteTester 1 问题是命令行参数可以带空格或不带空格
  • 在第二个 var 文件中使用一个 Ansible var 文件中的变量

    在使用 Ansible 时 我尝试使用保管的 vars 文件来存储私有变量 然后在另一个 vars 文件中以相同的角色使用这些变量 来自 Vault伪叶加密 的想法here https www reinteractive net posts
  • 如何编写Makefile来编译简单的C程序

    编译以下程序 include
  • 将应用程序加载到 Intel SGX enclave

    有没有办法将现有应用程序加载到Intel SGX直接飞地 虽然 hmofrad 的说法是正确的 但新交所不是designed要运行整个现有应用程序 are实现这一目标的方法 有SCONE https www usenix org syste
  • 将四边形图像提取为矩形

    赏金更新 下列的Denis s https stackoverflow com questions 2992264 extracting a quadrilateral image to a rectangle 2999689 299968
  • 使用 javascript 加载不同的 CSS 样式表

    我需要使用 javascript 根据正在传递的 URL 变量加载不同的样式表 场景是这样的 我们需要使用一个 CSS 样式表和一个不同的样式表来维护一个移动网站 当通过 iOS 应用程序中加载的 Web 视图访问该页面时 该样式表将用于设
  • python 3.6 selenium webdriver错误X显示需要发送密钥无法使用Xvfb

    我正在使用 selenium webdriver Chrome 为我的测试环境创建具有特定功能的网络驱动程序 class MyDriver webdriver Chrome def init self executable path chr
  • 如何使用匹配、排序和限制对 MongoDB 聚合进行排序

    我当前的聚合是 db group members aggregate match user id in 1 2 3 group id group id sort last post at 1 limit 5 对于以下文档结构 id user
  • 检查 Laravel 模型是否已保存或查询是否已执行

    我见过很多人使用这种方式来检查 Laravel 模型是否已保存 所以现在我想知道这是否是一种安全的方法 我还可以检查下面的查询是否像这样执行 检查模型是否已保存 Eg myModel new User myModel gt firstnam
  • 获取表达式类型的宏

    Question 我正在尝试编写一个 C 宏 它需要type or type name作为输入 并给出type作为输出 例如 REMOVE NAME int 应该int REMOVE NAME int aNumber 也应该是int 我设法