2017-01-25 1 views
2

나는 예를 들면, 사람이 읽을 수있는 문자열 유형으로 일부 서명 숯불 기계 값을 매핑 할 표준 : :지도를 사용하고 있습니다 :키가없는 경우 반환되는 항목을 정의 할 수있는 std :: map을 갖는 가장 좋은 방법은 무엇입니까?

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

내가 있도록이를 수정하고 싶은 것을 전달 된 키가 존재하지 않는 경우 지도는 "알 수 없음"을 반환합니다. 호출자 인터페이스가 동일하게 유지되도록 (즉, [] 연산자를 사용하여지도에서 문자열 만 검색하면됩니다.) 이 작업을 수행하는 가장 좋은 방법은 무엇입니까? Windows 7에서 C++ 11을 사용할 수 있습니다.

+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

관련 문제