如何从带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
相关产品推荐
相关产品推荐

