C++中如何从模板类的实例对象获取其对应的模板参数类型
这个需求完全可以实现,常用有两种实现方案:
方案1:模板类内嵌类型别名(推荐)
直接在模板类内部暴露模板参数的类型别名,是最通用的实现方式,STL的标准容器也都是用这种方式暴露元素类型:
#include <functional> template<class T> class A { public: A(){}; // 内嵌类型别名,对外暴露模板参数类型 using value_type = T; T data; }; int main() { A<int> a; // 先通过decltype获取对象a的类型A<int>,再取内部的value_type别名得到int std::function<void(decltype(a)::value_type)> foo; return 0; }
如果要兼容对象带const、引用修饰符的场景,可以搭配std::decay_t或者C++20的std::remove_cvref_t使用:std::remove_cvref_t<decltype(a)>::value_type。
方案2:独立类型萃取
如果你无法修改原模板类A的定义,可以单独实现一个类型萃取工具来提取模板参数:
#include <functional> #include <type_traits> template<class T> class A { public: A(){}; T data; }; // 萃取器基础模板 template<typename T> struct get_A_template_param; // 针对A类的偏特化,匹配A<T>并提取T template<typename T> struct get_A_template_param<A<T>> { using type = T; }; // 便捷别名,避免每次写typename template<typename T> using get_A_template_param_t = typename get_A_template_param<T>::type; int main() { A<int> a; std::function<void(get_A_template_param_t<decltype(a)>)> foo; return 0; }
以上两种方案都兼容C++11及以上所有标准版本。
内容的提问来源于stack exchange,提问作者OwlCodR
相关产品推荐
相关产品推荐

