2016-12-20 7 views
0

私はC++でハッシュテーブルクラスをimpelementする必要があるので、私はテンプレートクラスを作成することにしました:C++でさまざまなテンプレートパラメータを処理するにはどうすればよいですか?

template <typename key_t, typename value_t> 
class HashTable {}; 

そして、この場合は、私は、キーの種類をハッシュする必要があります。 私はそのような何かを試してみました:()をTYPEID

if(typeid(std::string) == typeid(_key)) { 
    return StrSum(_key) % TABLE_SIZE; 
} else { 
    return _key % TABLE_SIZE; 
} 

しかし、場合には、私のコンパイラ(MSVS)が私に「...のための定義された演算子%が存在しないというエラーを打つ、コンパイル時に定義関数ではありませんstd :: string "を参照してください。

私の質問は次のとおりです。どうすればいいですか?あなたがオーバーロードを使用することができます

+0

は何をすべきか、標準の[ 'のstd :: unordered_map'](http://en.cppreference.com/w/ cpp/container/unordered_map)はデフォルトのテンプレートパラメータとしてハッシュ関数を提供します。コンテナの実装者は、コンパイル時に実行可能な決定を実行時にプッシュしてはいけません。特に 'typeid'は悪名高く遅いです。 –

+0

私のコメントをバックアップするには、答えが遅すぎる。とにかく[ここ](http://ideone.com/KmkxFR)のコードを参照することもできます。 hash_tableの実装はデモンストレーションの手段にすぎず、明らかに適切な使用を意図していません。 –

答えて

2

void hash_impl(const std::string& x) 
{ 
    return StrSum(x) % TABLE_SIZE; 
} 

template <typename T> 
void hash_impl(const T& x) 
{ 
    return x % TABLE_SIZE; 
} 

あなたif ... elsehash_impl(_key)への呼び出しに置き換えることができます。


また、あなたがC++ 17でif constexpr(...)を使用することができます。

if constexpr(std::is_same<std::decay_t<decltype(_key)>, std::string>{}) 
{ 
    return StrSum(_key) % TABLE_SIZE; 
} 
else 
{ 
    return _key % TABLE_SIZE; 
} 
+0

アドバイスをいただきありがとうございますが、今私はあなたに新しい質問があります。文字列キーがない場合、どのようにhash_implを呼び出すべきですか?つまり、hash_impl(incomingKey)またはhash_impl (incomingKey)のように呼びますか? –

+0

'hash_impl(incomingKey)'は、テンプレートの引数が推測されるため、問題ありません。*(テンプレート以外の関数はテンプレートより優先されます)*。 –

関連する問題