You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现可接收类名作为参数的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 02:54:35