2

私は再実装してstd::mapいます。すべてのデータ型(基本またはユーザー定義)のキーが機能することを確認する必要があります。Mapクラスを、キーと値の2つのパラメーターを持つテンプレートとして宣言しました。私の質問は、キータイプとして文字列を使用する必要がある場合、文字列タイプのキーに対してのみ<および>演算子をオーバーロードするにはどうすればよいですか?テンプレートの特殊化では、私が理解しているように、必要なタイプでクラス全体を特殊化する必要があります。
これをより良い方法で行う方法はありますか?別のKeyクラスを追加し、それをKeyのテンプレートタイプとして使用するとどうなりますか?

4

2 に答える 2

1

通常のように、タイプとして比較を除外する必要std::mapがあります。つまり、ユーティリティクラスがありますless_compare

template <typename T>
struct less_compare
{
    bool operator()(const T& pLhs, const T& pRhs) const
    {
        return pLhs < pRhs;
    }
};

その後:

template <typename Key, typename Value, typename Compare = less_compare<Key> >
class map
{
    // ...

private:
    Compare mCompare;
};

そして、2つの値を比較するには、次のようにします。これは「より小さい」if (mCompare(someThing, someOtherThing))で真になります。この因数分解により、ユーザー定義の比較も可能になることに注意してください(これが「未満」が引用される理由です)。これは、ポリシーベースの設計として知られています。someThingsomeOtherThing

そして今、あなたはless_compareC文字列のクラスだけを専門にすることができます。(そしてまた提供greater_compareし、親族。)


これが学習用でない限り、独自のマップを実装するべきではないことを覚えておいてください。また、すでに過負荷になっていることに注意しstd::stringてください。operator<

于 2010-05-20T04:46:23.733 に答える
0

タイプ特性を使用することもできます。それはあなたにタイプ間の可能な将来の違いも解決するためのフレームワークを与えるでしょう。

于 2010-05-20T04:51:56.247 に答える