2

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

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>() { ... }
};
4

3 回答 3

6

您应该将专业化放在struct

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

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

没有办法在定义模板版本的同一个类中专门化成员函数。您必须在类之外显式专门化成员函数,或者专门化整个类中的成员函数。

于 2012-04-19T17:48:18.113 回答
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>() { ... }
};
于 2012-04-19T17:59:45.860 回答
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

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

于 2012-04-19T17:51:38.937 回答