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

如何存储模板函数methodA多次调用时使用的各类型T?

如何存储模板函数每次调用的类型T?

当然有办法啦!在C++里,我们可以通过几种不同的方式来记录每次调用methodA时用到的模板参数类型T,下面给你几个实用的方案:

1. 静态容器记录类型标识

如果只是想记录哪些类型被调用过,可以用std::type_index配合静态容器来存储类型信息,代码示例:

#include <vector>
#include <typeindex>
#include <typeinfo>

template<typename T> void methodA(T val) {
    // 静态容器,会在程序生命周期内保留所有调用过的类型
    static std::vector<std::type_index> called_types;
    called_types.push_back(std::type_index(typeid(T)));
    
    // 这里写你原本的methodA逻辑
}
  • 解释:std::type_index是类型的唯一标识,能安全地比较和存储类型信息;
  • 去重优化:如果不想重复记录相同类型的多次调用,把std::vector换成std::unordered_set<std::type_index>即可。

2. 存储参数值+类型(运行时)

如果需要同时保存每次调用的参数值和对应的类型,有两种选择:

确定类型范围时用std::variant

如果提前知道可能传入的类型集合,用std::variant会更安全高效:

#include <vector>
#include <variant>
#include <string>

// 定义所有可能用到的类型变体
using CallVariant = std::variant<int, std::string, double>;
// 全局容器存储每次调用的参数
std::vector<CallVariant> call_records;

template<typename T> void methodA(T val) {
    call_records.emplace_back(val);
    // 你的原有逻辑...
}

不确定类型范围时用std::any

如果类型完全不确定,std::any可以存储任意类型的值,但取出时需要手动指定类型:

#include <vector>
#include <any>

std::vector<std::any> call_records;

template<typename T> void methodA(T val) {
    call_records.emplace_back(val);
    // 你的原有逻辑...
}

// 后续取出示例
if (const auto* int_val = std::any_cast<int>(&call_records[0])) {
    // 处理int类型的值
}

3. 编译期记录类型(模板元编程)

如果是想在编译阶段就收集所有调用过的类型,适合用模板元编程的类型列表方案:

// 空的类型列表基类
struct TypeList {};

// 用于扩展类型列表的模板
template<typename CurrentType, typename PreviousList>
struct ExtendedTypeList {
    using Head = CurrentType;
    using Tail = PreviousList;
};

template<typename T> void methodA(T val) {
    // 静态变量触发类型列表扩展,编译期会生成对应的类型链
    static ExtendedTypeList<T, decltype(call_types)> call_types;
    
    // 你的原有逻辑...
}

这种方案主要用于编译期的类型检查、代码生成等场景,运行时无法直接遍历类型列表,需要借助编译期工具或元函数来处理。


内容的提问来源于stack exchange,提问作者Kit

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 09:12:33