2012-01-27 8 views
3

このコードを動作させる方法はありますか?クラステンプレート内の静的メソッドテンプレートの特殊化

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

http://stackoverflow.com/questions/767477/template-specialization-for-static-member-functions-howto – vulkanino

+0

ません。そこでは、構造体Xはテンプレート化されていません。私はfをクラス定義の外に移動しようとしましたが、どちらも動作しません。 –

+0

また、[this] [1]の投稿を参照してください。 [1]:http://stackoverflow.com/questions/1723537/template-specialization-of-a-single-method-from-a-templated-class –

答えて

4

他の人がコメントやリンクで指摘したように、現在のC++のテンプレートの構文は、この使用方法をサポートする簡単な方法を提供していません。しかし、もしあなたが本当にこれをやりたいと思っていれば、複雑さを導入する気にはなりません。あなたがに対処する必要が

二つの主な問題は、次のとおりです。

  1. 関数テンプレートは、部分的な特殊化をサポートしていません。
  2. クラススコープの一部として定義すると、部分的な特殊化は機能しません。

あなたが探しているものに近づき、それを試してみることができます。

  • 動きクラスの外テンプレート定義。
  • は、部分的なスペックを許可する代わりに、クラスファンクタとしてそれらのテンプレートを定義します。

このような何かのために導入された余分なコードの非常に多くのですが、あなたはそれが可能だ十分にこの悪い行いたい場合は、私が思う
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' 
} 

。私が求めているものを

+0

私は、ヘルパークラスの中で、ファンクタをインスタンス化するのではなく、静的なメンバを使うと思いますが、これは正しいアプローチです。 –

関連する問題