2017-01-25 1 views
2

J'utilise un std :: carte pour la carte des valeurs de la machine unsigned char dans les types de chaînes lisibles par l'homme, par exemple:Meilleure façon d'avoir std :: map où je peux définir ce qui est retourné s'il n'y a pas de clé?

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

J'aimerais modifier cette façon que si la clé passée n'est pas présent, la La carte renverra "Inconnu". Je veux que l'interface de l'appelant reste la même (c'est-à-dire qu'elle récupère simplement sa chaîne de la carte en utilisant l'opérateur []). Quelle est la meilleure façon de faire cela? J'ai C++ 11 sur Windows 7 disponible.

+3

Créer une enveloppe et mettre en œuvre la '' '' [] '' '' opérateur . – mascoj

+0

Bonne suggestion. Je ne suis pas sûr à quoi ressemblerait le constructeur pour utiliser un initialiseur de liste comme je l'ai dans l'exemple cependant. Des idées là-dessus? – SeanLabs

Répondre

7

Vous pouvez créer une enveloppe avec l'opérateur [] surchargée pour fournir le comportement requis:

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

Merci, semble idéal. – SeanLabs