2011-09-13 4 views
4

クラスの1つのインデックスに対してテンプレートの特殊化を実行したいと思います。たとえば、次のコードでは、第2クラスが何であるかにかかわらず、ファーストクラスがintのときは常に特殊化を作成します。これを実装する方法はありますか?1つのインデックスのみのC++メソッドテンプレートの特殊化

template <class K, class V> 
class myclass { 
    public: 
     void myfunc(K,V); 
}; 

template <class K, class V> 
myclass<K,V>::myfunc(K key, V value) { 
... 
} 

template< ,class V> 
myclass<int,V>::myfunc(int key, V value) { 
... 
} 
+0

同様の質問:[C++部分メソッド特化](http://stackoverflow.com/questions/1535816/c-partial-method-specialization) – Amro

答えて

5

単一のメソッド "myfunc"だけでなく、クラス "myclass"全体を特殊化する必要があります。次に例を示します。

#include <iostream> 

template <typename K, typename V> 
class myclass { 
    public: 
     void myfunc(K key, V value) 
     { 
      std::cout << "non-specialized " << key << "->" << value << std::endl; 
     } 
}; 


template<typename V> 
class myclass<int, V> { 
    public: 
     void myfunc(int key, V value) 
     { 
      std::cout << "specialized " << key << "->" << value << std::endl; 
     } 
}; 

int main(int argc, char* argv[]) 
{ 
    myclass<int, char> instance; 
    instance.myfunc(10, 'a'); 

    myclass<long, char> instance2; 
    instance2.myfunc(10L, 'a'); 

    return 0; 
} 
0

あなたはそうすることができますが、< intのためにmyclassを特化する必要がありますか? >ケース。これは、両方の場合にすべての定義を繰り返すことを意味します。あなたが望むものに正確に応じて、コードの重複を避けるために継承などを使って逃げることができるかもしれません。あなたが意図し何に何の更なる詳細と、答えは次のとおりです。

template< class K, class V > class myclass { general definition }; 
template< class V > class myclass< int, V >{ general definition }; 

あなたはより具体的な詳細とのより良い答えを得ることができ、テンプレートの世界での機会がたくさんあります。

+0

私は私自身のハッシュを実装しようとしていますテーブルはキーがクラスKであり、値はクラスVです。しかし、私はさまざまなタイプのKに対して異なるハッシュ関数を特化したいと考えていました。この場合、クラスVは依然として任意です。 – entitledX

+0

C++ 11のunordered_(hash)セットとマップ、またはそれらのBoost実装の仕組みを見てください:http://www.boost.org/doc/html/unordered.html –