2012-03-18 10 views
0

私は、int datatypeとchar *データ型をサポートするテンプレートを使用したコードを書いています。言わせてインスタンス化のためのC++テンプレートの仕様

struct node { 
    KeyType key; 
    struct node *next; 
}; 

これはリンクされたリストノードでソートされているので、ノードを挿入するたびに比較する必要があります。このために私は

LT(a,b).. 
GT(a,b).. 

のような比較演算を定義していると私はnode<int>を使用する場合、私は(私は定義を切り替えるマクロを使用して)node<char*> strncmp(a, b, SIZE)LT(a, b) as a<bとでケースを定義するための1つのヘッダファイルcomparison.hを、作成した ので、いずれかがあります私が最小限これに干渉する方法comparison.h。テンプレートを使用する場合、データ型に固有の比較や特定の操作を使用するより良い方法は何でしょうか?

答えて

0

template specializationを使用してください。

#include <iostream> 
#include <string> 
using namespace std; 

template <class T> 
class node { 
    T data; 
    public: 
    node(){} 
    static bool GT (const T& first, const T& second); 
}; 

template <class T> 
bool node<T>::GT(const T &first, const T &second) 
{ 
    std::cout << "general use" << std::endl; 
    return first > second; 
} 

template <> 
bool node<string>::GT(const string &first, const string &second) 
{ 
    std::cout << "called from a string" << std::endl; 
    return first.compare(second)>0; 
} 

int main() { 
    std::cout << node<int>::GT(10,20) << std::endl; 
    std::cout << node<string>::GT("Hello","World") << std::endl; 
    return 0; 
} 

出力は次のようになります:たとえば、あなたがクラステンプレートに機能を特化することはできません

general use 
0 
called from a string 
0 
+0

、あなたは全体のテンプレートを特殊化する必要があります。 –

+0

文字列クラスを使うと簡単です。 char *を使用できる解決策はありますか? char *にはアロケータクラスがないので – peeyush

関連する問題