【问题标题】:partial template member specialization部分模板成员特化
【发布时间】:2015-05-08 18:48:29
【问题描述】:

给出以下定义:

template <typename T>
class A {

public:

   void f();

};

template <typename T>
void
A<T>::f()
{}

template <typename T>
class B {};

我如何部分专门化A&lt;B&lt;T&gt;&gt;::f,即f 用于某些B&lt;T&gt;?我基本上是在寻找正确的魔法来代替下面的???

template <???>
void
A<B<T>>::f()
{}

【问题讨论】:

    标签: c++ templates partial-specialization


    【解决方案1】:

    你可以有一个 显式 特化,来自 [temp.expl.spec]:

    以下任何一项的明确特化:
    — ...
    — 类模板的成员函数
    — ...
    可以通过template&lt;&gt;引入的声明来声明

    即:

    template <>
    void A<B<int>>::f() {
        std::cout << "B\n";
    }
    

    但是你不能对类模板的成员函数进行部分特化。您将不得不部分专业化整个课程:

    template <typename T>
    class A<B<T>> {
    public:
        void f() {
            std::cout << "B\n";
        }
    
        // ... all other members you want in A<B<T>> ...
    };
    

    【讨论】:

    • 您知道标准中的哪个地方明确说明了这一点,即不允许对类模板的成员函数进行部分特化吗?
    • @regnirpsj 这有点暗示“类模板部分特化成员的模板参数列表应与类模板部分特化的模板参数列表匹配。类模板偏特化应匹配类模板偏特化的模板参数列表。"
    • 谢谢。我从来没有真正喜欢过标准的律师,但经过一些解析后,它是有道理的。
    • @regnirpsj 你也可以查看 14.8 函数模板特化 [temp.fct.spec]
    【解决方案2】:

    您不能部分特化成员函数(实际上也不能部分特化任何函数)。您需要对整个班级进行部分专业化:

    template<typename T>
    class A<B<T>>
    {
        // implement member functions for this specialization here
    };
    

    【讨论】:

      【解决方案3】:

      如果你必须有:

      template <typename T>
      void A<B<typename T>>::f() {}
      

      那么你唯一的选择就是部分专业化A

      template <typename T> class A<B<T>>
      {
         public:
            void f();
      };
      

      【讨论】:

        【解决方案4】:

        C++11 有Alias Templates,允许你做类似的事情:

        template<T>
        using AB = A<B<T>>;
        

        那你可以参考AB&lt;T&gt;而不是A&lt;B&lt;T&gt;&gt;

        很遗憾,you can't use that for specialization.

        所以在我看来,你的问题的答案是:你不能这样做,但很遗憾。

        【讨论】:

        • 别名模板与 OP 的问题有什么关系?
        • 它们是解决方案的前半部分。
        • 我不知道它们是解决方案的前半部分,因为您可能不会部分专门化成员函数。如果允许的话,可能只是template&lt;typename T&gt; void A&lt;B&lt;T&gt;&gt;::f() {}
        猜你喜欢
        • 1970-01-01
        • 2012-12-15
        • 2012-04-11
        • 1970-01-01
        • 2013-02-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多