如何仅修改TestWrapper提取任意单模板参数类的首个模板参数类型
实现方案
我们可以利用C++的模板偏特化特性,匹配任意单参数模板的实例类型,自动提取其第一个模板参数类型,全程不需要修改原有Test类的定义,对所有单模板参数类通用。
核心实现代码
// 主模板声明,仅接收任意类型参数,不提供默认实现 template<typename T> struct TestWrapper; // 偏特化版本:匹配所有单参数模板的实例类型 template<template<typename> class SingleArgTemplate, typename ParamType> struct TestWrapper<SingleArgTemplate<ParamType>> { // 提取到的第一个模板参数就是ParamType,直接声明成员即可 ParamType extradata; };
实现原理说明
- 主模板仅做声明,相当于做类型准入校验:如果传入的不是单参数模板的实例类型,会因为找不到匹配的实现直接编译报错,符合预期。
- 偏特化版本中使用了模板模板参数
SingleArgTemplate,它专门匹配接收1个类型参数的类模板,比如Test、自定义的foo、bar都可以匹配。 - 当你传入
Test<int>时,编译器会自动推导:SingleArgTemplate匹配为Test,ParamType匹配为int,因此偏特化版本被选中,内部extradata的类型就是int,完全符合需求。
完整可运行示例
template<typename T> struct Test { T value; }; // 主模板声明 template<typename T> struct TestWrapper; // 偏特化实现 template<template<typename> class SingleArgTemplate, typename ParamType> struct TestWrapper<SingleArgTemplate<ParamType>> { ParamType extradata; }; // 测试自定义其他单参数模板 template<typename U> struct Foo { U data; }; int main() { // 测试Test<int>场景 TestWrapper<Test<int>> temp; temp.extradata = 123; // 此处extradata类型为int,赋值合法 // 测试其他自定义单参数模板,同样生效 TestWrapper<Foo<double>> temp2; temp2.extradata = 3.14; // extradata类型为double }
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

