如何将类模板的偏特化用作模板模板参数?
问题解答
首先明确:无法直接写出S<A<someNumber>>这样的代码,因为A<someNumber>属于「绑定了部分参数的模板实例(模板id)」,而S要求的模板模板参数必须是一个模板名称,而非模板id。不过我们可以通过中间包装的方式实现类似的效果,让你能灵活指定i的值,同时满足S的参数要求。
解决方案一:嵌套别名模板的包装类模板
这是兼容性最好的方案(支持C++11及以上):
先定义一个接受size_t参数的包装类模板,内部嵌套符合S要求的单参数别名模板:
template<size_t i> struct AWrapper { template<typename T> using Type = A<i, T>; };
然后就可以通过包装类指定i的值,再将内部的Type传给S:
// 使用i=5的情况 S<AWrapper<5>::Type> someStruct; // 使用i=10的情况 S<AWrapper<10>::Type> anotherStruct;
这个方案的核心是通过AWrapper<i>将i的值绑定,然后导出一个仅接受typename T的模板,完美匹配S的模板模板参数要求。
解决方案二:修改S的模板参数(若允许)
如果你有权修改S的定义,可以直接调整它的模板模板参数,让它支持绑定非类型参数的模板:
// 修改后的S,接受双参数模板+固定的size_t参数 template<template<size_t, class> typename T, size_t i> struct SModified {};
使用时直接传入A和指定的i值即可:
SModified<A, 5> someStruct;
这个方案更直观,但依赖于修改原有的S结构,仅适用于允许调整S的场景。
为什么原有的固定值别名模板无法扩展?
你之前定义的Inner是固定绑定i=5的别名模板,而C++不允许对别名模板进行偏特化,所以无法直接通过偏特化让Inner支持不同的i值。而上面的包装类模板相当于把i作为外层模板的参数,绕过了别名模板不能偏特化的限制。
内容的提问来源于stack exchange,提问作者PyOPTProblem
相关产品推荐
相关产品推荐

