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
//compilewith:/EHsc
#include<iostream>
template<typenameT>
classX:publicT{
public:
voidDump(){
std::cout<<"InX<T>::Dump()"<<std::endl;
__if_exists(T::Dump){
T::Dump();
}
__if_not_exists(T::Dump){
std::cout<<"T::Dumpdoesnotexist"<<std::endl;
}
}
};
classA{
public:
voidDump(){
std::cout<<"InA::Dump()"<<std::endl;
}
};
classB{};
boolg_bFlag=true;
classC{
public:
voidf(int);
voidf(double);
};
intmain(){
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::fexists"<<std::endl;
}
return0;
}
Output
InX<T>::Dump() InA::Dump() InX<T>::Dump() T::Dumpdoesnotexist g_bFlag=1 C::fexists
__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语句。