Лучший способ обмена парами ключ-значение в 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.