从嵌套模板中提取外层模板并实现using类型别名
解决方案
要实现你需要的功能,得先借助一个辅助模板特质递归提取嵌套结构里最底层的模板,再用using封装成你要的类型别名。具体代码如下:
1. 定义模板提取特质
先写一个extract_template模板,用来从嵌套的模板实例里递归挖出最内层的模板:
// 基础模板,处理非模板实例类型(可选,用于非法输入时报错提示) template<typename T> struct extract_template { static_assert(false, "仅支持单参数模板的嵌套实例"); }; // 特化版本:匹配单参数模板的直接实例 template<template<typename> class Temp, typename Arg> struct extract_template<Temp<Arg>> { // 定义模板别名,用新参数实例化提取到的模板 template<typename NewArg> using type = Temp<NewArg>; }; // 递归特化:处理多层嵌套的模板实例,直接继承内层的提取结果 template<template<typename> class OuterTemp, typename Inner> struct extract_template<OuterTemp<Inner>> : extract_template<Inner> {};
2. 定义outer类型别名
基于上面的特质,用using封装成单一的别名:
template<typename T> using outer = typename extract_template<T>::template type;
测试验证
现在可以按照你的期望使用了:
struct s0 { }; template<typename T> struct s1 { }; template<typename T> struct s2 { }; // 等价于 s1<int> using test1 = outer<s1<s0>>int>; // 等价于 s1<int> using test2 = outer<s2<s1<s0>>>int>;
原理说明
- 传入
s1<s0>时,extract_template匹配直接实例的特化版本,提取出s1模板,outer<s1<s0>>会变成一个接受新参数的模板别名,传入int就得到s1<int>。 - 传入
s2<s1<s0>>时,递归特化版本会先处理内层的s1<s0>,继承它的提取结果,最终同样得到s1模板,传入int后生成s1<int>。
内容的提问来源于stack exchange,提问作者111111
相关产品推荐
相关产品推荐

