C++编程中__if_exists与__if_not_exists语句的用法

__if_exists 语句
__if_exists 语句测试指定的标识符是否存在。如果该标识符存在,则执行指定的语句块。
语法

__if_exists ( identifier ) {
statements
};

参数

参数 说明
identifier 要测试其存在性的标识符。
statements identifier 存在时要执行的一个或多个语句。

备注
若要实现最可靠的结果,请在以下约束条件下使用 __if_exists 语句。
只将 __if_exists 语句应用于简单类型,而不是模板。
将 __if_exists 语句应用于类的内部或外部的标识符。请勿将 __if_exists 语句应用于局部变量。
请仅在函数的主体中使用该 __if_exists 语句。在函数主体外部,__if_exists 语句仅能测试完全定义的类型。
在测试重载函数时,不能测试特定形式的重载。
__if_exists 语句的补集是 __if_not_exists 语句。
请注意,此示例使用了模板,不建议这样做。

// 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;
}

Output

In X<T>::Dump()
In A::Dump()
In X<T>::Dump()
T::Dump does not exist
g_bFlag = 1
C::f exists

__if_not_exists 语句
__if_not_exists 语句测试指定的标识符是否存在。如果该标识符不存在,则执行指定的语句块。
语法

__if_not_exists ( identifier ) {
statements
};

参数

参数 说明
identifier 要测试其存在性的标识符。
statements identifier 不存在时要执行的一个或多个语句。

备注
若要实现最可靠的结果,请在以下约束条件下使用 __if_not_exists 语句。
只将 __if_not_exists 语句应用于简单类型而不是模板。
将 __if_not_exists 语句应用于类的内部或外部的标识符。不要将 __if_not_exists 语句应用于局部变量。
仅在函数的主体中使用 __if_not_exists 语句。在函数主体的外部,__if_not_exists 语句仅能测试完全定义的类型。
在测试重载函数时,不能测试特定形式的重载。
__if_not_exists 语句的补集为 __if_exists 语句。

(0)

相关推荐

  • 详解C++编程中的条件判断语句if-else与switch的用法

    if-else 语句 控制条件分支. 语法 if ( expression ) statement1 [else statement2] 备注 如果 expression 的值不为零,执行 statement1 .如果选项 else 存在,如果 expression 的值为零,执行 statement2. 表达式必须是算术或指针类型,或者必须是定义明确的整型或指针类型转换的类类型.有关转换器的信息,请参见标准转换. 在两个形式的 if 语句和 expression 语句中计算,可以具有除结构以外

  • C++条件语句和条件运算符的使用方法讲解

    if语句的3种形式 1) if(表达式) 语句. 例如: if(x>y) cout<<x<<endl; 这种if语句的执行过程见下图. 2) if(表达式) 语句1 else 语句2 例如: if (x>y) cout<<x; else cout<<y; 见图. 3) if(表达式1) 语句1 else if(表达式2) 语句2 else if(表达式3) 语句3 - else if(表达式m) 语句m else 语句n 例如: if (numb

  • C++条件及循环语句的综合运用实例

    用下面公式求π的近似值.π/4≈1-1/3+1/5-1/7+-直到最后一项的绝对值小于10-7为止.根据给定的算法很容易编写程序如下: #include <iostream> #include <iomanip> #include <cmath> using namespace std; int main( ) { int s=1; double n=1,t=1,pi=0; while((fabs(t))>1e-7) { pi=pi+t; n=n+2; s=-s;

  • C++编程中逗号运算符和条件运算符的使用方法讲解

    逗号运算符:, 允许对两个语句进行分组,其中有一个是预期的. expression , expression 备注 逗号运算符具有从左向右的关联性. 由逗号分隔的两个表达式将从左向右进行计算. 始终计算左操作数,并且在计算右操作数之前将完成所有副作用. 在某些上下文(如函数参数列表)中,逗号可用作分隔符. 不要将该逗号用作分隔符与将其用作运算符的情况混淆:这两种用法完全不同. 考虑表达式 e1 , e2 该表达式的类型和值是 e2 的类型和值:e1 的计算结果将被丢弃. 如果右操作数是左值,则结

  • C++编程中__if_exists与__if_not_exists语句的用法

    __if_exists 语句 __if_exists 语句测试指定的标识符是否存在.如果该标识符存在,则执行指定的语句块. 语法 __if_exists ( identifier ) { statements }; 参数 参数 说明 identifier 要测试其存在性的标识符. statements identifier 存在时要执行的一个或多个语句. 备注 若要实现最可靠的结果,请在以下约束条件下使用 __if_exists 语句. 只将 __if_exists 语句应用于简单类型,而不是模

  • Android编程中常用适配器及自定义适配器用法实例分析

    本文实例讲述了Android编程中常用适配器及自定义适配器用法.分享给大家供大家参考,具体如下: 一.适配器. 顾名思义,就是把一些数据给弄得适当,适合以便于在View上显示.可以看作是界面数据绑定的一种理解.它所操纵的数据一般都是一些比较复杂的数据,如数组,链表,数据库,集合等.适配器就像显示器,把复杂的东西按人可以接受的方式来展现. 那么适配器是怎么处理得到的数据,并把它显示出来的呢.其实很简单,说白了适配器它也是一个类,在类里面它实现了父类的这几个方法: publicint getCoun

  • 浅谈Swift编程中switch与fallthrough语句的使用

    在 Swift 中的 switch 语句,只要第一个匹配的情况(case) 完成执行,而不是通过随后的情况(case)的底部,如它在 C 和 C++ 编程语言中的那样.以下是 C 和 C++ 的 switch 语句的通用语法: 复制代码 代码如下: switch(expression){    case constant-expression  :       statement(s);       break; /* optional */    case constant-expressio

  • Swift编程中的switch...case语句实例解析

    Swift中的switch...case语句可以判断对象类型, Objective-C中则必须是整数. 不可以穿透,可以不写break, var rank = "A" switch rank{ case "A": //相当于if print("优") case "B": // 相当于else if print("优") case "C": // 相当于else if print(&quo

  • Python中生成器和yield语句的用法详解

    在开始课程之前,我要求学生们填写一份调查表,这个调查表反映了它们对Python中一些概念的理解情况.一些话题("if/else控制流" 或者 "定义和使用函数")对于大多数学生是没有问题的.但是有一些话题,大多数学生只有很少,或者完全没有任何接触,尤其是"生成器和yield关键字".我猜这对大多数新手Python程序员也是如此. 有事实表明,在我花了大功夫后,有些人仍然不能理解生成器和yield关键字.我想让这个问题有所改善.在这篇文章中,我将解

  • Python编程中的for循环语句学习教程

    Python for循环可以遍历任何序列的项目,如一个列表或者一个字符串. 语法: for循环的语法格式如下: for iterating_var in sequence: statements(s) 流程图: 实例: #!/usr/bin/python # -*- coding: UTF-8 -*- for letter in 'Python': # 第一个实例 print '当前字母 :', letter fruits = ['banana', 'apple', 'mango'] for f

  • Ruby编程中关于中断和返回的用法教程

    return,break,next 这几个关键字的使用都涉及到跳出作用域的问题,而他们的不同 则在于不同的关键字跳出去的目的作用域的不同,因为有代码块则导致有一些地方需要格外注意. return 常用方式 通常情况下的return语句和大家理解的意思是相同的. def m1 param if param == 1 return 'returned 1' end 'returned default value' # 根据Ruby语言规范,最后一条执行语句的结果将作为返回值返回,return是可选的

  • 详解Java多线程编程中互斥锁ReentrantLock类的用法

    0.关于互斥锁 所谓互斥锁, 指的是一次最多只能有一个线程持有的锁. 在jdk1.5之前, 我们通常使用synchronized机制控制多个线程对共享资源的访问. 而现在, Lock提供了比synchronized机制更广泛的锁定操作, Lock和synchronized机制的主要区别: synchronized机制提供了对与每个对象相关的隐式监视器锁的访问, 并强制所有锁获取和释放均要出现在一个块结构中, 当获取了多个锁时, 它们必须以相反的顺序释放. synchronized机制对锁的释放是

  • 详解C++中赋值和输入输出语句的用法

    C++赋值语句讲解 C++的赋值语句具有其他高级语言的赋值语句的功能.但不同的是,C++中的赋值号"="是一个运算符,可以写成 a=b=c=d; 而在其他大多数语言中赋值号不是运算符,上面的写法是不合法的. 关于赋值表达式与赋值语句的概念.在C++中,赋值表达式可以包括在其他表达式之中,例如: if((a=b)>0) cout<<"a>0"<<endl; 按语法规定if后面的( )内是一个条件.现在在x的位置上换上一个赋值表达式&

随机推荐