如何实现可接收类名作为参数的C++自定义函数?
实现接收类名的自定义函数
首先要明确:C++中普通函数无法直接将类型作为实参传递(typeid是运算符而非函数,所以可以直接接收类型)。要实现类似func(A)的调用效果,需要借助模板和一些小技巧,下面是两种可行方案:
方案1:无参数模板函数(最简洁)
定义一个模板函数,通过模板类型参数接收目标类型,函数内部直接使用typeid(T).name()输出类名:
#include <iostream> #include <typeinfo> class A {}; // 模板函数,T为传入的类型参数 template <typename T> void func() { std::cout << typeid(T).name() << std::endl; } // 调用方式:显式指定模板参数 int main() { func<A>(); // 输出类A的名称,效果等同于typeid(A).name() return 0; }
这种方式的调用语法是func<A>(),和typeid(A)的写法接近,是最直接的实现方式。
方案2:借助类型标签模拟func(A)写法
如果希望调用语法更接近func(A),可以通过类型标签结构体来实现:
#include <iostream> #include <typeinfo> class A {}; // 定义类型标签模板,用于包裹类型 template <typename T> struct TypeTag {}; // 接收TypeTag<T>的函数,推导模板参数T template <typename T> void func(TypeTag<T>) { std::cout << typeid(T).name() << std::endl; } // 调用时传入TypeTag<A>(),可以配合宏简化写法 #define CALL_FUNC(T) func(TypeTag<T>()) int main() { func(TypeTag<A>()); // 直接调用 CALL_FUNC(A); // 用宏简化后,写法接近func(A) return 0; }
通过宏CALL_FUNC(A)可以实现几乎和func(A)一致的调用体验,本质是宏帮我们生成了类型标签的临时对象。
关键说明
- 模板类型参数
typename T(或class T)是实现接收类型输入的核心,它让函数可以处理任意类型(类、基本类型等)。 typeid(T).name()的输出格式由编译器决定(比如GCC会输出简化的类名,MSVC会输出更详细的名称),和直接调用typeid(A).name()的效果完全一致。
内容的提问来源于stack exchange,提问作者yingzi
相关产品推荐
相关产品推荐

