如题所述
c++ 是一门没有反射机制的语言,所以你想要的功能是没有的。
c++ 和java这种半解释型的语言不通,java编译只是生成字节码,在运行的时候会 载入 JVM,所以在程序运行中,仍然可以知道这个的类型,变量,函数,annotation等信息。
但c++ 不同,虽然他有原型声明,但那是在编译的时候用的。在程序运行中,它只知道类中有些什么类型的变量,比如int ,float,double,std::string。 但具体的这个类型是什么比如 std::string name 还是 std::string address 它不会分。
当然你也可以自己实现,比如,在类中弄一个map<string ,void*> ,来自己描述这个类。不过太麻烦。
c++ 和java这种半解释型的语言不通,java编译只是生成字节码,在运行的时候会 载入 JVM,所以在程序运行中,仍然可以知道这个的类型,变量,函数,annotation等信息。
但c++ 不同,虽然他有原型声明,但那是在编译的时候用的。在程序运行中,它只知道类中有些什么类型的变量,比如int ,float,double,std::string。 但具体的这个类型是什么比如 std::string name 还是 std::string address 它不会分。
当然你也可以自己实现,比如,在类中弄一个map<string ,void*> ,来自己描述这个类。不过太麻烦。
温馨提示:答案为网友推荐,仅供参考
第1个回答 2016-10-24
前段时间看到的
* value 为bool型检查结果
* type为s成员的类型(value为true是有效)
*/
template<typename T>struct has_member_s{
template <typename _T>
static auto check(_T)->typename std::decay<decltype(_T::s)>::type;
static void check(...);
using type=decltype(check(std::declval<T>()));
enum{value=!std::is_void<type>::value};
};
使用方法
struct foo{int s;
};
if(has_member_s<foo>::value){
cout<<"s"<<endl;
}
当然还可以配合enable_if使用
要注意的是,判断是在编译时期进行的!
本回答被提问者采纳