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

从嵌套模板中提取外层模板并实现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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 07:07:42