1

CLSID 構造を別のもの (文字列など) に関連付けることができるコンテナーを作成したいと考えています。たとえば、std::map です。

(CLSID は標準 Windows CLSID 構造を意味します)

ただし、find() と insert (object[clsid] = string) を使用したい場合、STL が失敗してエラーが発生します。

これを解決する方法を知っている人はいますか?

例えば:

typedef std::map<CLSID, std::string> MyCLSIDMap;
MyCLSIDMap mymap;
CLSID sample = CLSID_NULL;

mymap[sample] = string("test");   // compilation failed here
4

3 に答える 3

5

アレックスが答えたように、std::map はそのキーを op< と比較する必要があります。

bool operator<(CLSID const& l, CLSID const& r)
{
    return memcmp(&l, &r, sizeof(CLSID)) < 0;
}
于 2009-04-30T01:59:01.567 に答える
2

CLSID 構造は使用可能な operator<() をサポートしていますか? これは std::map にとって非常に重要です (2 つの const CLSID& 引数を取る個別の bool ファンクターとして構築できます。CLSID のメソッド operator<() である必要はありませんが、std: :map だけでなく、map ...!)。

于 2009-04-30T01:56:58.310 に答える
0

キーが構造体である STL マップを使用するには、独自の厳密な弱順序関数オブジェクトを提供する必要があります。

struct CompareCLSID
{
  bool operator()(const CLSID &s1, const CLSID &s2) const
  {
    // returns true if s1 is less than s2
  }
};

マップのタイプは map<CLSID, string, CompareCLSID> になります。

ただし、コンテナーをソートする必要がない場合 (私の推測です)、hash<> または hash_map<> を使用する必要があります。その場合、独自のハッシュ関数を提供する必要があります。

于 2009-04-30T02:02:06.707 に答える