Лучший способ обмена парами ключ-значение в C++

Когда я пытался передать карту пар строк, я чувствовал, что слишком много моего кода было жестко запрограммировано (строки используются в качестве ключей) и не очень элегантно. Вот почему я хотел бы спросить, есть ли лучшая практика при желании поделиться картой.

Что я пробовал

Карта с жестко закодированными строками

Создание:

std::map<std::string, std::string> GetDataAsMap(){
    std::map<std::string, std::string> data;
    data["id"] = ReadProperty("id");
    ...
    return data;
}

Расход:

auto dataMap = GetDataAsMap();
int id = dataMap["id"];

Вопросы:

  • Жестко закодированные строки
  • Легко вводить опечатки, которые не будут обнаружены во время компиляции
  • Потребитель должен знать, какие ключи будут присутствовать (т.е. обрабатывать необязательные значения)

Карта с жестко закодированными строками, но также передает использованные ключи

std::map<std::string, std::string> GetDataAsMap(std::set<std::string>& keys){
    std::map<std::string, std::string> data;
    data["id"] = ReadProperty("id");
    keys.insert("id");
    ...
    return data;
}   

Здесь я могу перебрать ключи в случае, если мне нужно только показать данные пользователю, но в остальном выиграно не так много

Карта со значениями перечисления в качестве ключей

std::map<std::string, std::string> GetDataAsMap(){
    std::map<std::string, std::string> data;
    data[Keys::ID] = ReadProperty("id");
    ...
    return data;
}   
  • Исправляет проблему с опечатками
  • По-прежнему возникают проблемы, когда некоторые значения являются необязательными
  • Нет элегантного способа (насколько мне известно), чтобы получить строковое представление перечислений, т.е. показать в таблице

Вопрос

Есть ли лучшая практика или способ пойти лучше, чем я пробовал здесь?

1 ответ

Возьмите значения карты и распакуйте их в структуру. Необязательные значения могут быть выражены с использованием boost::option или std::option в C++17.

Другие вопросы по тегам