使用 SFINAE 检测 C++ 中类型的 POD 性

2024-01-08

这里原来的标题是VS2005 C++ 中 SFINAE 错误的解决方法

这是暂时使用 SFINAE 来等效 TR1 中存在的 is_pod 模板类(在 VS2005 中还没有 TR1)。应该有它的value当模板参数是 POD 类型(包括基本类型和由它们组成的结构)时,成员为 true;当模板参数不是 POD 类型时(如非平凡的构造函数),成员为 false。

template <typename T> class is_pod
{
  public:

    typedef char Yes;
    typedef struct {char a[2];} No;

    template <typename C> static Yes test(int)
    {
      union {T validPodType;} u;
    }
    template <typename C> static No test(...)
    {
    }
    enum {value = (sizeof(test<T>(0)) == sizeof(Yes))};
};

class NonPOD
{
  public:
    NonPod(const NonPod &);
    virtual ~NonPOD();
};

int main()
{
  bool a = is_pod<char>::value;
  bool b = is_pod<NonPOD>::value;
  if (a) 
    printf("char is POD\n");
  if (b)
    printf("NonPOD is POD ?!?!?\n");
  return 0;
}

问题是,VS 2005 不仅没有 TR1,它也不会关心上面的并集(当模板参数不是 POD 时,它不应该有效),因此 a 和 b 的计算结果都为 true。


感谢下面发布的答案。仔细阅读它们(和代码)后,我意识到我想做的确实是一个错误的方法。这个想法是将 SFINAE 行为与对模板的适应结合起来必须是 pod(我在书上找到的不完美的C++,但也可以在其他地方找到)。实际上,这需要 SFINAE 制定一套非常特殊的规则,显然这不是标准定义的。毕竟,这并不是 VS 中的一个真正的错误。


您的方法的最大问题是您在这里不执行 SFINAE - SFINAE 仅适用于此处的参数类型和返回类型。

然而,在标准中的所有 SFINAE 情况中,没有一个适用于您的情况。他们是

  • void、引用、函数或大小无效的数组
  • 不是类型的类型成员
  • 指向引用的指针、对引用的引用、对 void 的引用
  • 指向非类类型成员的指针
  • 模板值参数的转换无效
  • 参数类型为 void 的函数类型
  • 常量/易失性函数类型

这可能就是为什么 Boost 文档中有:

没有一些(尚未指定)帮助 从编译器来看,ispod 永远不会 报告一个类或结构是 荚;如果可能的话,这总是安全的 次优。目前(2005 年 5 月)仅 MWCW 9 和 Visual C++ 8 具有 必要的编译器-_intrinsics。

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

使用 SFINAE 检测 C++ 中类型的 POD 性 的相关文章

  • 如何防止 Json.NET 将枚举转换为字符串?

    下面的课 public class RequestSections RequestBase public RequestSections Command c Dictionary
  • 有没有办法为向量采用内存资源?

    我已经开始在我的项目中使用 pmr allocators 并且我已经看到使用它们带来了很多性能提升和优势 我使用的分配器与我在下面的简单示例中展示的非常相似 include
  • 哪些 iomanip 操纵器具有“粘性”?

    我最近在创建一个stringstream由于我错误地假设std setw 会影响每次插入的字符串流 直到我明确更改它 然而 插入后它总是被取消设置 With timestruct with value of Oct 7 9 04 AM st
  • 根据另一个列表的内容对列表进行排序

    我有一个包含整数列表的列表和另一个包含同时包含整数和字符串的类的列表 我想做的是按字母顺序对列表进行排序 将第一个列表中存在的条目放在前面 这是我的代码和预期输出 using System using System Collections
  • Rx Framework:在超时时执行操作,而不中断原始可观察序列

    给定一个可观察的源 通过轮询低级设备的 变化 状态生成 observable source metacode IObservable
  • 获取光标相对于控件的位置 - C#

    我想获取鼠标相对于鼠标指针所在控件的位置 这意味着当我将光标置于控件的起点 左上角 时 它应该给出 0 0 我正在使用以下代码 private void panel1 MouseMove object sender MouseEventAr
  • 将 Visual Studio 2012 C++ 单元测试项目链接到 exe 会导致访问冲突

    我从现有的整体 exe 本机 Visual Studio 2012 项目开始 我想添加一个本机单元测试项目 根据http msdn microsoft com en us library hh419385 aspx objectRef ht
  • 堆栈独立的C/C++蓝牙API?

    我想知道是否有适用于 Windows XP Vista 7 x86 和 x64 的堆栈独立 C C 蓝牙 api 我的目标是创建连接并通过蓝牙发送 接收一些时间关键的数据 我的研究给了我以下选择以及这项任务的缺点 用于蓝牙的 Windows
  • 如何在Qt无框窗口中实现QSizeGrip?

    如何使用 Qt 无框窗口实现 QSizeGrip 代码会是什么样的 您只需在布局内窗口的一角添加 QSizeGrip 即可使其保持在该角落 QDialog dialog new QDialog 0 Qt FramelessWindowHin
  • 输入缓冲区刷新

    考虑下面的代码 include
  • 如何从c++调用python

    我是Python新手 我尝试像这样从 C 调用 python 脚本 在 Raspberry Pi 中 std string pythonCommand python Callee py a b int res system pythonCo
  • 如何在单独的类库中管理客户端上下文对象?

    我正在尝试创建一个库 类库 对于共享点 它将拥有所有共享点 dll 来与共享点服务器交互上传文件 文档并创建文档库和文档集 现在这个库可以被使用客户端 例如 Web 应用程序 asp net webform 或 mvc 或控制台应用程序或
  • 将 libpng 链接到 android 原生项目

    我在尝试在本机 Android 项目中加载 libpng 时遇到问题 编译器似乎无法识别 libpng 函数 但可以识别类型 如 png byte 它可以正常编译类型 但如果我添加函数 则会抛出错误 这是编译输出 Windows 7 cmd
  • 如何在OpenGL中像这样绘制连接的带状线

    我想用以下方式绘制一系列连接线 GL LINE STRIP 我尝试过自己编写代码 但没有得到想要的结果 所以我来到这里 帮助我找出我错在哪里 这里我只给出我的draw 函数 glBegin GL LINE STRIP glVertex2f
  • STL 向量、迭代器和插入 (C++)

    我有一个将向量的迭代器传递到的方法 在这个方法中 我想向向量中添加一些元素 但我不确定当只有迭代器时这是否可行 void GUIComponentText AddAttributes vector
  • 更改预处理到文件后出现错误 1 ​​错误 LNK1104

    我必须使用预处理器 所以我改变了 配置属性 gt C gt 预处理器 gt 预处理为文件 gt 是 并得到错误 错误 1 错误 LNK1104 无法打开文件 Debug asnreal obj 这个问题的解决办法 我必须在 lib 文件的路
  • C中的pipe()和fork()

    我需要创建两个子进程 一个子进程需要运行命令 ls al 并将其输出重定向到下一个子进程的输入 而下一个子进程又将对其输入数据运行命令 sort r n k 5 最后 父进程需要读取该数据 已排序的数据 并将其显示在终端中 终端中的最终结果
  • TypeScript 中 C# 类虚拟成员的等效项

    因此 在 C 中 当我创建模型类和延迟加载内容时 我会执行以下操作 public int User ID get set public int Dept ID get set 然后在我的班级稍远一点的地方 我像这样弹出我的虚拟 public
  • MsBuild 在 Visual Studio Online 上找不到恢复的 NuGet 包

    我尝试构建一个存储在 Visual Studio Online 上的外部 GIT 存储库中的解决方案 它有以下步骤 1 Git 恢复 有效 2 NuGet 恢复 有效 3 构建 不起作用 查看日志时我的第一个猜测是 MsBuild 没有查找
  • AddressAccessDeniedException :无需 netsh 即可解决它?

    我遇到了异常AddressAccessDeniedException因为我的processus没有注册URL的权限 我首先以管理员身份运行我的程序 好的 它成功了 但我现在想要分发我的应用程序 并且我希望每个用户都能够运行它 而不必成为管理

随机推荐

  • 使用 MSBuild FileUpdate 任务仅更改 AssemblyInfo.cs 中的修订号

    我只需要更改版本号AssemblyInfo cs文件 版本号的格式为主要 次要 构建 修订 e g 1 4 6 0 目前我用以下命令更改版本FileUpdate任务 来自MSBuild 社区任务项目 http msbuildtasks ti
  • 将 JUNG 移植到 GWT [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 有一个非常好的java图形库JUNG http jung sourceforge net 我想知道是否存在任何 GWT 库可以完成 JUN
  • 无法更新 Xcode 11 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 尝试从 Xcode 11 GM 更新到 11 1 总是失败 我首先尝试移动 Applications Xcode app 没有任何效果 这
  • 无法关闭 CFMX 8 中的持久跟踪 cookie

    CFMX 8 企业版 我已打开 内存变量 下的 使用 J2EE 会话变量 设置 因为安全要求规定不能使用持久 cookie 我知道打开此设置将告诉 CF 仅创建和使用 JSESSIONID 会话 cookie 然而 我的服务器似乎仍在创建和
  • 如何在 rxjs 管道中有条件地执行某些操作?

    有人可以告诉我带有条件操作的 rxjs 管道的正确语法是什么吗 在这种情况下 如果环境名称数组长度不为 1 我想使用过滤器进行映射 如何使用不返回的 if 语句 是否有任何 rxjs 运算符 environmentName env1 env
  • SwiftUI:ViewModifier,其中内容是图像

    我收到错误 Type PlayButtonModifier does not conform to protocol ViewModifier 我不明白为什么 更重要的是 我不明白如何正确地做到这一点 我只是尝试创建一个ViewModifi
  • MongoDB 4.x 实时同步到 ElasticSearch 6.x +

    我正在尝试找到一种简单的方法将 mongoDB 4 x 中的数据同步到 elasticsearch 6 x 我的用例是 Elasticsearch 支持但 mongodb 不支持的部分文本搜索 MongoDB 是我的应用程序的主要数据库 我
  • 使用node.js从输入中获取密码

    如何使用node js从输入中获取密码 这意味着您不应该输出在控制台中输入的密码 您可以使用read https www npmjs com package read module 披露 我写的 为了这 在你的外壳中 npm install
  • python 中的块作用域 - 与函数内部的 javascript 提升类似吗?

    我目前正在尝试理解Python中的这段代码 def foo a if a 12 var Same else var different 我阅读并理解了 python 不支持基于块的作用域这一事实 因此 函数内创建的所有内容 无论是在循环内还
  • 如何使用 Akka HTTP 表示表单数据请求?

    我想创建一个表单数据http请求脸书API https developers facebook com docs graph api video uploads使用 Akka HTTP 在curl中 请求示例如下所示 curl X POST
  • 检查数据库连接,否则显示消息

    我想检查该网站是否可以连接到 mySQL 如果没有 我想显示一个错误 指出用户应该在几分钟内尝试再次访问该页面 我真的不知道该怎么做 任何帮助将不胜感激 string mysql error resource link identifier
  • 使用 firebug 查找 JavaScript 中的内存泄漏?

    是否有适用于 Firefox 的附加组件可以用来找出部分 JavaScript 导致内存泄漏的情况 我对 Firefox 没有任何了解 但 Chrome 中的 webkit 检查器有一个内置的分析器 非常适合此类事情 作为一个额外的好处 它
  • 在Python中加载大文件

    我正在使用在 Ubuntu 9 04 上运行的 Python 2 6 2 GCC 4 3 3 我需要使用 Python 脚本逐行读取一个大数据文件 1GB gt 300 万行 我尝试了以下方法 发现它占用了很大的内存空间 3GB for l
  • 正则表达式,匹配不带“http://”和任何其他“/”的 url

    我环顾四周 但可能我无法使用正确的关键字 谷歌 所以我在这里 我需要将 url 剥离协议与第一个 相匹配 Target 匹配从 http 到第一个 可能是最后一个 不存在 或到结尾的第一个子字符串 那么问题来了 我写了这个正则表达式 但这个
  • 预定义类型“System.Runtime.CompilerServices.IsExternalInit”未定义或导入[重复]

    这个问题在这里已经有答案了 我在使用 Visual Studio 2019 Preview 测试 C 9 0 的新功能时一直遇到这个问题 我正在测试 init setter 但编译器显示错误并显示以下消息 错误 CS0518 未定义或导入预
  • 通过 Exchange EWS API 批准电子邮件

    我遇到一种情况 我需要将邮件重新路由到另一个作为主持人的邮箱 以编程方式 有没有办法批准我在主持人邮箱中收到的消息 我没有看到 EWS 对此有明确的支持 微软还有其他 API 类型支持这个吗 这不是官方批准的方式 但以下解决方法可以帮助我批
  • jQuery 增量读取 AJAX 流?

    我读过了这个问题 https stackoverflow com questions 6093103 jquery ajax display data as it comes in但它并不能完全回答我的问题 不幸的是 自从我上次查看 AJA
  • 找不到类型或命名空间 AppServiceConnection

    我无法找到在新计算机上编译的解决方案 该解决方案包含一个与控制台应用程序打包在一起的 UWP 应用程序 UWP 应用程序通过以下方式与控制台应用程序进行通信应用服务连接 https learn microsoft com en us uwp
  • 覆盖moment js默认的无效日期文本

    我如何覆盖 moment js var defaultInvalidDate Invalid date 无需更改 moment js 文件 就像我的网站使用 Site css 覆盖某些 bootstrap css 样式一样 所以当 boot
  • 使用 SFINAE 检测 C++ 中类型的 POD 性

    这里原来的标题是VS2005 C 中 SFINAE 错误的解决方法 这是暂时使用 SFINAE 来等效 TR1 中存在的 is pod 模板类 在 VS2005 中还没有 TR1 应该有它的value当模板参数是 POD 类型 包括基本类型