2017-01-25 13 views
2

Я использую зЬй :: карту для отображения некоторых значений без знака гольца машины в читаемые строковых тип человека, например:Лучший способ иметь std :: map, где я могу определить, что возвращается, если нет ключа?

std::map<unsigned char, std::string> DEVICE_TYPES = { 
    { 0x00, "Validator" }, 
    { 0x03, "SMART Hopper" }, 
    { 0x06, "SMART Payout" }, 
    { 0x07, "NV11" }, 
}; 

Я хотел бы изменить это так, что если ключ передается не присутствует, карта вернется «Неизвестно». Я хочу, чтобы интерфейс вызывающего абонента оставался прежним (т. Е. Они просто извлекают свою строку с карты с помощью оператора []). Каков наилучший способ сделать это? У меня есть C++ 11 на Windows 7.

+3

Создать оболочку и осуществление '' '' [] '' '' оператора , – mascoj

+0

Хорошее предложение. Я не знаю, как выглядит конструктор для использования инициализатора списка, как в примере. Есть идеи по этому поводу? – SeanLabs

ответ

7

Вы можете создать некоторую обертку с оператором [] перегружено, чтобы обеспечить требуемое поведение:

class Wrapper { 
public: 
    using MapType = std::map<unsigned char, std::string>; 

    Wrapper(std::initializer_list<MapType::value_type> init_list) 
     : device_types(init_list) 
    {} 

    const std::string operator[](MapType::key_type key) const { 
     const auto it = device_types.find(key); 
     return (it == std::cend(device_types)) ? "Unknown" : it->second; 
    } 

private: 
    const MapType device_types; 
}; 

wandbox example

+0

Спасибо, выглядит идеально. – SeanLabs