由模板参数具体化的类型的模板特化
Posted
技术标签:
【中文标题】由模板参数具体化的类型的模板特化【英文标题】:Template specialization for type concretized by template parameter 【发布时间】:2018-08-23 17:33:29 【问题描述】:首先我很抱歉这个问题的标题,但很难描述。
如果我想将Resolve
专门用于A
的所有实例化,那么下面这两个中的哪一个是有效语法?
1)
template<uint32_t I> struct A ;
template<typename> struct Resolve;
template<uint32_t I>
struct Resolve<A<I>>
void f() printf("im here!\n");
;
2)
template<uint32_t I> struct A ;
template<typename> struct Resolve;
template<>
template<uint32_t I>
struct Resolve<A<I>>
void f() printf("im here!\n");
;
或者template<>
是可选的吗? SO上有两个不同的答案:here和here。
如有可能,请提供标准报价。
选项 2) 不能在 MSVC 上编译,但至少可以在某些版本的 GCC 上编译。
【问题讨论】:
第二篇文章接受的答案明确指出template <>
位无效。
可惜没说为什么
我不确定您在寻找什么。如果标准中没有任何内容表明它是有效的,那么它就是无效的。
好吧,也许标准在某处说这种情况。如果没有,那么我会回答第一个无效
【参考方案1】:
这是正确的:
template <uint32_t I>
struct Resolve<A<I>>
;
语法template <>
用于引入显式特化(类模板、函数模板等)(参见[temp.spec]/3 和[temp.expl.spec]/1)。但我们正在尝试进行部分专业化。部分特化仍然需要引入模板参数,而显式特化则不需要。
另一方面,如果我们试图特化显式特化的成员,那么我们将使用template <>
。例如:
template <class T>
struct A
template <class T2> struct B ; // #1
;
template <> // for A
template <class T2> // for B
struct A<int>::B<T2> ; // #2
A<char>::B<int> x; // #1
A<int>::B<char> y; // #2
【讨论】:
以上是关于由模板参数具体化的类型的模板特化的主要内容,如果未能解决你的问题,请参考以下文章