1

20 バイトで構成される 4 つの異なるものの組み合わせをハッシュする必要があるため、次のように定義しました。

struct holder
{
  char a;
  uint16_t b;
  uint64_t c;
  char d[9];
} __attribute((__packed__));

次に、上記のいずれかをロードして、ハッシュ関数に渡します。それで、クラスFoostd::tr1::unordered_map<holder, int> map. しかし、 のヘッダー ファイルでそれを宣言するにFooは、 の定義、私のタイプの の内部のテンプレート特殊化、および結果として完全なハッシュ関数を含める必要がありholderます。このすべてのコードをヘッダーに含めずに、クラスにこのハッシュマップを与える方法はありますか?std::tr1hash

4

2 に答える 2

4

関数をヘッダー ファイルで宣言し、cpp ファイルで定義するだけです。

これは次のようになります。

// Header
namespace std { namespace tr1

// Define specialization
template<>
struct hash<holder>: unary_function<holder, size_t> {
    // Declare member
    size_t operator()(holder const&) const;
};

} }

// Source

// Define member
std::size_t std::tr1::hash<holder>::operator()(holder const&) const
{ /* implementation */ }
于 2012-10-26T21:05:28.047 に答える
0

ホルダーのハッシュの特殊化はヘッダーに含めることができますが、実装はそうである必要はありません。これを行うためのわかりやすい方法として、それ(特殊化)は、cppファイルで定義したホルダーのbog標準関数を呼び出すだけです。

于 2012-10-26T21:16:51.967 に答える