如何存储模板函数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
相关产品推荐
相关产品推荐

