2017-02-06 18 views
1

クラステンプレートに静的メソッドを定義する方法はありますか?インスタンス化を指定せずに呼び出すことはできますか?インスタンス化を指定せずにクラステンプレートの静的メソッドを呼び出す方法はありますか?

これは、クラスに論理的に属している補助的な静的関数(テンプレートの場合があります)がある場合に便利ですが、テンプレートパラメータには依存しません。

私はどちらか気にしない:

  1. はすべて インスタンス化のために(アドレスおよびすべてを含む)同じ静的メソッドを持つ、または
  2. 各インスタンス化のための別々の静的メソッドを持つことが、のことができるように メソッドを呼び出すインスタンス化を指定せずに静的メソッドを呼び出します(デフォルトでは が呼び出されます)。

template<typename T> class C { 
public: 
    static int func() { return 0; } 
}; 

int main() 
{ 
    // This works. 
    return C<int>::func(); 

    // These don't work. 
    // return C<>::func(); 
    // return C::func(); 
} 
+3

テンプレートのインスタンス化に依存しない場合は、通常の静的な静的(静的でない)関数にしてみましょう。 –

+0

"これは論理的にクラスに属している補助静的関数がある場合に便利だと思います" – Danra

+2

'template 'のような不正なデフォルトテンプレートパラメータを追加することがあります。テンプレート引数を指定せずにメソッドを呼び出し可能にします。 'C <> :: func()' –

答えて

3

最も簡単な解決策は、静的な機能を持っている、おそらくですが、基本クラスに属し、その後、テンプレートがベースから派生:

struct CBase { 
    static int func() { return 0; } 
}; 

template<typename T> class C : public CBase { 
public: 
}; 

int main() 
{ 
    // This works. 
    return C<int>::func(); 

    // This will work too: 
    return CBase::func(); 
} 
-1

どのように働くだろうか?通常、静的関数の型にも依存します。

template<typename T> class C { 
public: 
    static int func() { return sizeof(T); } 
}; 

これらが依存していない場合は、このクラスの基本クラスのフリー関数または静的メンバーにする必要があります。

+0

"これは論理的にクラスに属しているテンプレートスタティック関数を持っている場合に便利だと思いますが、テンプレートパラメータには依存しません*" – Danra

+0

それはまだテンプレートクラスの一部です。また、この部分を受け入れて、同じコードの折り畳みの下でそれらをマージするリンカを残すことができます... – dascandy

3

あなたはつまり、あなたのバイナリに(また、テンプレートの種類を気にしない)以外の静的な機能の重複を削除します継承、使用することができます:あなたがCを取得したい場合は

class A { 
public: 
    static int func() { return 0; } 
}; 

template<typename T> 
class B : A { 

}; 
2

をあなたが与えられた関数が含まれているか、それは次のようにテンプレートの特殊化を使用してベース非テンプレートクラスに頼ることができるのいずれかに動作するかC<>:プライマリテンプレートの定義を提供しないために

template<typename...> 
struct C; 

template<> 
struct C<> { 
    static int func() { return 0; } 
}; 

template<typename T> 
struct C<T>: C<> { 
    // all the other things around... 
}; 

int main() { 
    C<int>::func(); 
    C<>::func(); 
} 

、specialiを受け入れzationsは以下のとおりです。

それは

wandbox上でそれを参照してください元の例にあったようにパラメータのみを受け入れるだけ与えられた機能

  • C<T>が含まれてい
    • C<>


      バリデーショナルテンプレートを使用できない場合でも、カスタムタイプと同様のことを実行できます。一例として、
      :言われていること

      struct func_only {}; 
      
      template<typename T = func_only> 
      struct C; 
      
      template<> 
      struct C<func_only> { 
          static int func() { return 0; } 
      }; 
      
      template<typename T> 
      struct C: C<func_only> { 
          // all the other things around... 
      }; 
      
      int main() { 
          C<int>::func(); 
          C<>::func(); 
      } 
      

      、それはフリー機能はとにかく最善の解決策として、私には見えるように。

  • +0

    それは賢いです! 'C <>'は 'C 'と密接に関連していることは明らかです(読者には明らかです)。私はそれを書くことができないという欠点があります。 –

    +0

    @MartinBonnerどうしてですか?質問にはタグはありません。私はC++ 11以降のリビジョンを想定しています。それは事実ではありませんか? – skypjack

    +0

    申し訳ありませんが、 "私はそれを書くことができませんでした"と、私は "私はそれを考え出す技術的なスキルはありません"を意味しました!コンパイラは作業中に問題はありません。 –

    関連する問題