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

如何从带bool模板参数的实例获取原始类模板类型?

从单个bool参数的实例化模板类中提取原始类模板

你的需求是从任意接受单个bool作为模板参数的实例化对象里,提取出不带参数的原始类模板,进而创建同模板但bool参数不同的对象。但你写的代码编译失败,核心问题是:FT模板的参数要求是类模板+bool值的组合,可你传入的decltype(t)是已经实例化完成的具体类型T<true>,两者完全不匹配,编译器自然无法推导。

下面是可行的解决方案,利用模板特化来匹配并提取:

// 基础模板,用于匹配任意类型
template<typename T>
struct ExtractTemplate;

// 特化版本,专门匹配「接受单个bool参数的类模板的实例」
template<template<bool> typename Template, bool B>
struct ExtractTemplate<Template<B>> {
    // 提取出的原始类模板
    using type = Template;
    // 该实例使用的bool参数值
    static constexpr bool value = B;
};

// 辅助别名,简化类型提取的写法
template<typename T>
using ExtractTemplate_t = typename ExtractTemplate<T>::type;

// 辅助变量模板,快速获取原实例的bool参数
template<typename T>
constexpr bool ExtractTemplateValue_v = ExtractTemplate<T>::value;

然后在你的代码里这样用:

template<bool X>
struct T {};

int main() {
    T<true> t;
    // 提取原始类模板T
    using RawType = ExtractTemplate_t<decltype(t)>;
    // 创建同模板但bool参数为false的对象
    RawType<false> f;

    // 额外:还能获取原实例的bool参数值做校验
    static_assert(ExtractTemplateValue_v<decltype(t)> == true);
}

这个方案的通用性很强,只要是接受单个bool参数的类模板实例,都能被正确提取。比如你再定义其他类似模板:

template<bool Flag>
struct MyConfig {};

int main() {
    MyConfig<false> cfg;
    using RawConfig = ExtractTemplate_t<decltype(cfg)>;
    RawConfig<true> new_cfg; // 完全合法
}

内容的提问来源于stack exchange,提问作者Wad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 20:54:21