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

この場合、どの構文を使用すればよいですか?

EDIT:今のところ、コードの行数が最も少ない解決策は、偽のテンプレート関数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 に答える