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语句。