C++中typeid().name()语法含义及自定义实现疑问
关于C++中typeid的本质与类似语法实现
typeid究竟是什么?
typeid是C++语言内置的运算符,并非函数——这就是IDE不会给它显示函数类提示的原因。它属于C++ RTTI(运行时类型识别)机制的一部分,作用是获取对象或类型的类型信息。
它有两种使用形式:
typeid(类型):直接传入类型名,比如typeid(int)typeid(表达式):传入变量或表达式,比如typeid(a)
为什么能调用name()方法?
调用typeid(a)时,它返回的是一个**std::type_info类型的const引用**,而name()是std::type_info类的成员函数,用于返回类型的名称字符串(注意:返回的名称格式由编译器决定,不同编译器输出可能不同,比如GCC会输出简化的类型标识,MSVC则会输出更详细的名称)。
完整示例代码:
#include <iostream> #include <typeinfo> int main() { int a = 12; const std::type_info& type_info_obj = typeid(a); std::cout << type_info_obj.name() << std::endl; // GCC下输出"i",代表int类型 return 0; }
如何实现类似的语法?
要实现X(a).func()这种“调用后直接链式调用成员方法”的语法,核心是让X(...)返回一个包含目标成员方法的对象(或对象引用),以下是两种常见实现方式:
方式1:重载operator()(模拟typeid的运算符风格)
定义一个类,重载其operator()让它返回自身或包含成员方法的对象,再搭配全局实例模拟typeid的全局使用方式:
#include <iostream> #include <string> class MyTypeChecker { public: // 模板重载operator(),支持任意类型的变量 template<typename T> MyTypeChecker operator()(const T&) { type_name = typeid(T).name(); return *this; } // 模拟name()成员方法 std::string name() const { return type_name; } private: std::string type_name; }; // 全局实例,模拟typeid的全局调用形式 MyTypeChecker my_typeid; int main() { int a = 12; std::cout << my_typeid(a).name() << std::endl; // GCC下输出"i" return 0; }
方式2:普通函数返回带成员方法的对象
无需运算符重载,直接用函数返回一个封装了成员方法的对象:
#include <iostream> #include <string> #include <typeinfo> class TypeInfoWrapper { public: explicit TypeInfoWrapper(const std::string& name) : type_name(name) {} std::string name() const { return type_name; } private: std::string type_name; }; template<typename T> TypeInfoWrapper my_typeid(const T&) { return TypeInfoWrapper(typeid(T).name()); } int main() { double b = 3.14; std::cout << my_typeid(b).name() << std::endl; // GCC下输出"d" return 0; }
这两种方式都能实现和typeid(a).name()一致的链式调用语法。
内容的提问来源于stack exchange,提问作者PARSA FARAJZADEH
相关产品推荐
相关产品推荐

