类模板中静态方法模板的特化

时间:2012-01-27 12:47:22

标签: c++ templates

有没有办法让这段代码有效?

template<typename T> class test{
public:
    template<typename T2> static void f(){
        cout<<"generic"<<endl;
    }
    template<> static void f<void>(){    //specialization of static method for template T2, within generic class template with argument T
        cout<<"void"<<endl;
    }
};

如果没有,是因为它算作函数的部分模板特化吗?

1 个答案:

答案 0 :(得分:4)

正如其他人在评论和链接中指出的那样,当前的C ++模板语法没有提供支持这种用法的简单方法。但是,如果你真的想这样做,你不介意介绍一些复杂性。

您必须处理的两个主要问题是:

  1. 功能模板不支持部分专业化。
  2. 当您将其定义为类范围的一部分时,部分特化不起作用。
  3. 要绕过他们并接近你正在寻找的东西,你可以尝试。

    • 将模板定义移到课堂外。
    • 将这些模板定义为类仿函数,而不是允许部分规范。

    template<typename T>
    class test
    {
    public:
      template <typename T2>
      static void f();
    };
    
    template <typename T1, typename T2>
    struct f
    {
        void operator ()(void) { cout << "generic" << endl; }
    };
    
    template <typename T1>
    struct f<T1, void>
    {
        void operator ()(void) { cout << "void" << endl; }
    };
    
    template <typename T>
      template <typename T2>
      void test<T>::f()
      {
        ::f<T, T2>()();
      }
    
    int main()
    {
      test<int>::f<int>();      // prints 'generic'
      test<int>::f<void>();     // prints 'void'
    }
    

    这是为这样的事情引入的大量额外代码,但我想如果你想做到这么糟糕就有可能。