7

フェールセーフでアクセスする関数を書きたいですstd::map

コードの多くの場所でstd::mapキーでアクセスしたいのですが、キーが存在しない場合に備えて、例外ではなく一種のデフォルト値が必要です (これは「何もない」ための多くのコードです)。

このテンプレートベースの関数を書きました

template <typename T1, typename T2>
T2 mapGetByKey(std::map<T1, T2>& map, T1 key, T2 defaultValue={})
{
    auto it = map.find(key);

    if (it != map.end())
    {
        return it->second;
    }

    return defaultValue;
};

それはうまくいきます。しかし、std::map<int, const char*>私は別の振る舞いをしたいと思います。したがって、この専門化を追加できます。

template <typename T1>
const char* mapGetByKey(std::map<T1, const char*>& map, T1 key, const char* defaultValue="")
{
    auto it = map.find(key);

    if (it != map.end())
    {
        return it->second;
    }

    return defaultValue;
};

それも機能します。しかし、それはたった1つのケースのための多くのコードだと思います.

""の呼び出しに対してdefaultValue を設定せずに行を保存する方法を知っている人はいstd::map<int, const char*>ますか?

コンパイル時に型を区別する方法はありifdefますか?

4

3 に答える 3

4

オプション1

template <typename T>
T defaultValue()
{
    return {};
}

template <>
const char* defaultValue<const char*>()
{
    return "default string";
}

template <typename T1, typename T2>
T2 mapGetByKey(std::map<T1, T2>& map, const T1& key)
{
    auto it = map.find(key);

    if (it != map.end())
    {
        return it->second;
    }

    return defaultValue<T2>();
}

デモ1

オプション #2

template <typename T> struct identity { using type = T; };

template <typename T1, typename T2>
T2 mapGetByKey(std::map<T1, T2>& map, T1 key, const typename identity<T2>::type& defaultValue = {})
{
    auto it = map.find(key);

    if (it != map.end())
    {
        return it->second;
    }

    return defaultValue;
}

template <typename T1>
const char* mapGetByKey(std::map<T1, const char*>& map, const T1& key)
{
    return mapGetByKey(map, key, "default string");
}

デモ 2

于 2015-08-14T10:23:38.070 に答える
0

デフォルト値のテンプレート関数を追加し、特定のタイプに特化したバージョンを追加できます。

template <typename T>
T default_value() { return {}; }
template <>
const char* default_value<const char*>() { return ""; }

その後

template <typename T1, typename T2>
T2 mapGetByKey(std::map<T1, T2>& map, T1 key, T2 defaultValue=default_value<T2>())

住む

于 2015-08-14T10:27:14.483 に答える