読者です 読者をやめる 読者になる 読者になる

extension std::map

C++

std::map に bool has_key(Key); を拡張する



#ifndef SHAND_EXTENSION_STD_MAP_INCLUDE
#define SHAND_EXTENSION_STD_MAP_INCLUDE

#include <map>
#include <functional> // std::tr1::result_of

namespace shand { namespace extension {

template <class Key>
class has_key_t {
    Key key_;

public:
    typedef bool result_type;

    has_key_t(const Key& key)
        : key_(key) {}

    template <class UKey, class UValue>
    bool operator()(const std::map<UKey, UValue>& source) const
    {
        return source.find(key_) != source.end();
    }
};

template <class Key>
inline has_key_t<Key> has_key(Key key)
{
    return has_key_t<Key>(key);
}

template <class Key, class Value, class Func>
inline typename std::tr1::result_of<Func(const std::map<Key, Value>&)>::type
    operator|(const std::map<Key, Value>& source, Func func)
{
    return func(source);
}

}} // shand::extension

#endif // SHAND_EXTENSION_STD_MAP_INCLUDE


サンプル

#include <iostream>
#include <map>
#include <string>
#include <shand/extension/map.hpp>

using namespace std;
using namespace shand::extension;

int main()
{
    map<string, int> dict;

    dict["Akira"]   = 23;
    dict["Johnny"]  = 38;
    dict["Millia"]  = 16;

    if (dict|has_key("Akira")) {
        cout << "found" << endl;
    }

    return 0;
}


std::tr1::result_of を使っているので注意

TR1 ライブラリがないコンパイラでは をインクルードすること


ライブラリまとめ