在模板定义中专门化模板成员

时间:2012-04-19 17:43:24

标签: c++ templates

可以在模板定义之外专门化一些类成员函数:

template<class A>
struct B {
   void f();   
};

template<>
void B<int>::f() { ... }

template<>
void B<bool>::f() { ... }

在这种情况下,我甚至可以省略一般类型f的函数A的定义。

但是如何把这个专业化放在课堂上呢?像这样:

template<class A>
struct B {
   void f();   

   void f<int>() { ... }
   void f<bool>() { ... }
};

在这种情况下我应该使用什么语法?

编辑: 目前,使用最少代码行的解决方案是添加假模板函数f定义并从原始函数f显式调用它:

template<class A>
struct B {
   void f() { f<A>(); }

   template<class B> 
   void f();

   template<> 
   void f<int>() { ... }

   template<> 
   void f<bool>() { ... }
};

3 个答案:

答案 0 :(得分:6)

您应该将专业化放在struct

template<>
struct B<int> {
   void f() { ... }
};

template<>
struct B<bool> {
   void f() { ... }
};

无法在定义模板化版本的同一个类中专门化成员函数。要么必须在类外部明确地专门化成员函数,要么专门化一个包含成员函数的整个类。

答案 1 :(得分:4)

您可以在结构中使B::f成为模板函数:

struct B {
    template <typename T>
    void f();

    template<>
    void f<int>() { ... }

    template<>
    void f<bool>() { ... }
};

编辑:

根据你的评论,这可能对你有帮助,但我没有测试它是否有效:

template <typename A>
struct B {
    template <typename T = A>
    void f() { ... }

    template<>
    void f<int>() { ... }

    template<>
    void f<bool>() { ... }
};

答案 2 :(得分:0)

#include<iostream>
using namespace std;

template<class A>
class B
{
public:
  void f() {
    cout << "any" << endl;
  }
};

template<>
class B<int>
{
public:
  void f() {
    cout << "int" << endl;
  }
};

int main()
{

  B<double> b1;
  b1.f();
  B<int> b2;
  b2.f();
  return 0;
}

输出:

any
int

其他任何事情都是不可能的。