словарь — лучший способ обмена парами ключ-значение в стеке переполнения

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

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

Создание:

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;
}
  • Исправляет проблему с опечатками
  • По-прежнему возникают проблемы, когда некоторые значения являются необязательными
  • Нет элегантного (насколько мне известно) способа получить строковое представление перечислений, то есть показать в таблице

Вопрос

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

0

Решение

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

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector