msdn 中有这样一个示例:

// the__if_exists_statement.cpp // compile with: /EHsc #include <iostream> template<typename T> class X : public T { public: void Dump() { std::cout << "In X<T>::Dump()" << std::endl; __if_exists(T::Dump) { T::Dump(); } __if_not_exists(T::Dump) { std::cout << "T::Dump does not exist" << std::endl; } } }; class A { public: void Dump() { std::cout << "In A::Dump()" << std::endl; } }; class B {}; bool g_bFlag = true; class C { public: void f(int); void f(double); }; int main() { X<A> x1; X<B> x2; x1.Dump(); x2.Dump(); __if_exists(::g_bFlag) { std::cout << "g_bFlag = " << g_bFlag << std::endl; } __if_exists(C::f) { std::cout << "C::f exists" << std::endl; } return 0; }

但是不能检测某个变量是否有某个成员,象下面这样的代码是不能编译的:

template<class TA> void foo(TA& a) { __if_exists(a.x) { printf("a has a.x/n"); } // 上面不能编译无所谓可以转化成 __if_exists(TA::x) { printf("a has a.x/n"); } // 但是这个就不是很容易了: __if_exists((complex expression).a) { } }

或许是因为本质上,可以通过其它方法实现这个功能,也就是依据目前的这种机制,也可以达到目的,但是繁琐一些,需要加一个中间层,例如:

template<class TA> void foo1(TA& a, true_type) { printf("a has a.x/n"); } template<class TA> void foo1(TA& a, false_type) { printf("a has not a.x/n"); } template<class TA> void foo(TA& a) { __if_exist(TA::x) { foo1(a, true_type()); } __if_not_exist(TA::x) { foo1(a, false_type()); } }

vc 鲜为人知的 __if_exists相关推荐

  1. VC/MFC 进程间通信方法总结

    VC/MFC 进程间通信方法总结 摘   要   随着人们对应用程序的要求越来越高,单进程应用在许多场合已不能满足人们的要求.编写多进程 / 多线程程序成为现代程序设计的一个重要特点,在多进程程序设计 ...

  2. ​VC投资中的第一性原理

    VC投资的过程,其实是投资人在现实世界做了一次关于社会科学的实验. 社会科学研究跟自然科学研究其实有很多相似的地方:虽然人类对现实世界的低速宏观物理研究,已经日趋完善,其中经典力学.经典电磁场理论和经 ...

  3. VC串口通信编程-2

    VC串口通信编程 (2009-07-08 13:48:40) 转载▼ Win32串口编程(转:韩耀旭) 在工业控制中,工控机(一般都基于Windows平台)经常需要与智能仪表通过串口进行通信.串口通信 ...

  4. VC中基于 Windows 的精确定时

    方式一:VC中的WM_TIMER消息映射能进行简单的时间控制.首先调用函数SetTimer()设置定时 间隔,如SetTimer(0,200,NULL)即为设置200ms的时间间隔.然后在应用程序中增 ...

  5. VC manifest

    manifest原理和用途 dll是被动态调用的,所以会被若干个程序共享使用的 但是如果dll在应用程序不知道的情况下升级了.或是被另一个程序更改了,就可能会出现问题,即"DLL Hell& ...

  6. VC运行时库(/MD、/MT等)

    VC项目属性→配置属性→C/C++→代码生成→运行时库 可以采用的方式有:多线程(/MT).多线程调试(/MTd).多线程DLL(/MD).多线程调试DLL(/MDd).单线程(/ML).单线程调试( ...

  7. vc picture控件载入背景图,随控件大小改变

    在mfc里,想要在Picture控件中载入一张图片有两种方法:静态的和动态的.静态的方法就是图片先载入资源(.rc)文件中,拥有一个唯一的ID:动态的方法就是制定图片的路径名即可. 当然这样的方法网上 ...

  8. VC开发Windows客户端软件之旅——前言

    从第一次拖着行李入京找活,至今已工作若干年了.这些年一直追逐自己的梦想,跑过三个城市,换了三份工作,认识了很多业内的朋友.和朋友们闲聊时,发现很多人都已经不再做客户端软件了.有的转去做管理,有的转去做 ...

  9. WMI技术介绍和应用——使用VC编写一个半同步查询WMI服务的类

    在<WMI技术介绍和应用--VC开发WMI应用的基本步骤>文中,我们介绍了VC使用WMI技术的基本框架.本节我将讲解封装和实现一个用于半同步查询WMI的类.(转载请指明出于breaksof ...

最新文章

  1. C 语言编程 — 逻辑控制语句
  2. 分区时磁盘上没有足够的空间完成此操作的解决方法
  3. 初探目前最火的鸿蒙系统,跑了个 “hello world”!
  4. 大道至简第7,8章读后感
  5. 围猎“下沉市场”,争抢「小镇青年」,尚美如何突围?
  6. 基于React的表单开发的分析(上)
  7. LeetCode 题 - 27. 移除元素 python实现
  8. python文章抄袭检测_中小学生的噩梦:怎样用Python检测抄袭行为?广大中小学生们的美梦就此结束...
  9. 阿里研究院安筱鹏:云计算推动企业迈向高频竞争时代
  10. python做单因素方差分析
  11. 转行3D建模,C4D与3ds Max哪个更好入门就业
  12. JVM调优案例详解及面试题
  13. JAVA_SSM装饰装修公司管理系统(含论文)毕业设计【演示视频】
  14. python实现情人节的爱意表达
  15. 树莓派使用nginx+rtmp搭建音频直播流媒体服务器
  16. webservice课件
  17. 专访vivo和蔡司:不想做第一就做不成影像长赛道
  18. 自己动手搞个印象笔记桌面版
  19. 芒果超媒市值超爱奇艺:长视频的异类?
  20. 如何用PS批量裁剪照片

热门文章

  1. 台式机插上耳机,声音仍然外放问题解决
  2. 哈工大CSAPP大作业 2022
  3. 央视《每周质量报告》:揭秘假宽带真相
  4. 汽车电子——常见的英文缩写(更新中)
  5. Flink SQL xxx is not serializable. The object probably contains or references non serializable field
  6. 丰富网页摘要——HTML5中的“微数据”(MicroData)
  7. Win10 Microsoft Edge浏览器播放视频出现绿屏情况解决之一
  8. 消费者人群画像 python_如何正确打开相似人群画像算法
  9. Linux 命令(142)—— hexdump 命令
  10. NLTK异常问题 [nltk_data] Error loading reuters: <urlopen error [Errno 11004] [nltk_data] getaddrinfo