由模板参数具体化的类型的模板特化

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&lt;&gt; 是可选的吗? SO上有两个不同的答案:here和here。 如有可能,请提供标准报价。

选项 2) 不能在 MSVC 上编译,但至少可以在某些版本的 GCC 上编译。

【问题讨论】:

第二篇文章接受的答案明确指出template &lt;&gt; 位无效。 可惜没说为什么 我不确定您在寻找什么。如果标准中没有任何内容表明它是有效的,那么它就是无效的。 好吧,也许标准在某处说这种情况。如果没有,那么我会回答第一个无效 【参考方案1】:

这是正确的:

template <uint32_t I>
struct Resolve<A<I>>
 ;

语法template &lt;&gt; 用于引入显式特化(类模板、函数模板等)(参见[temp.spec]/3 和[temp.expl.spec]/1)。但我们正在尝试进行部分专业化。部分特化仍然需要引入模板参数,而显式特化则不需要。

另一方面,如果我们试图特化显式特化的成员,那么我们将使用template &lt;&gt;。例如:

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

【讨论】:

以上是关于由模板参数具体化的类型的模板特化的主要内容,如果未能解决你的问题,请参考以下文章

C++模板进阶

C++模板进阶

C++模板—部分特化

模版的完全特化与偏特化

C++模板详解:泛型编程模板原理非类型模板参数模板特化分离编译

C++模板详解:泛型编程模板原理非类型模板参数模板特化分离编译