Неверное отбрасывание const, потому что оператор [] на карте <> создаст запись, если она не присутствует с созданной по умолчанию строкой. Если карта на самом деле находится в неизменном хранилище, то она потерпит неудачу. Это должно быть так, потому что operator [] возвращает неконстантную ссылку для разрешения присваивания. (например, m [1] = 2)
Быстрая бесплатная функция для сравнения:
template<typename CONT>
bool check_equal(const CONT& m, const typename CONT::key_type& k,
const typename CONT::mapped_type& v)
{
CONT::const_iterator i(m.find(k));
if (i == m.end()) return false;
return i->second == v;
}
Я подумаю о синтаксическом сахаре и обновлю, если что-нибудь подумаю.
...
Непосредственный синтаксический сахар включал свободную функцию, которая выполняет отображение <> :: find () и возвращает специальный класс, который упаковывает карту <> :: const_iterator, а затем перегруженный operator == () и operator! = ( ), чтобы разрешить сравнение с сопоставленным типом. Таким образом, вы можете сделать что-то вроде:
if (nonmutating_get(m, "key") == "value") { ... }
Я не уверен, что это намного лучше, чем:
if (check_equal(m, "key", "value")) { ... }
И это, конечно, намного сложнее, а то, что происходит, гораздо менее очевидно.
Целью обтекания объекта итератором является прекращение создания объектов данных по умолчанию. Если вам все равно, просто используйте ответ «get».
В ответ на комментарий о том, что предпочтение будет отдано сравнению в надежде найти какое-то будущее использование, у меня есть эти комментарии:
Скажите, что вы имеете в виду: вызов функции с именем "check_equal" дает понять, что вы выполняете сравнение на равенство без создания объекта.
Я рекомендую реализовывать функциональность только тогда, когда у вас есть такая необходимость. Делать что-то до этого часто является ошибкой.
В зависимости от ситуации, конструктор по умолчанию может иметь побочные эффекты. Если вы сравниваете, зачем делать что-то лишнее?
Аргумент SQL: NULL не эквивалентен пустой строке. Действительно ли отсутствие ключа в вашем контейнере совпадает с тем, что ключ присутствует в вашем контейнере с созданным по умолчанию значением?
Сказав все это, созданный по умолчанию объект эквивалентен использованию map <> :: operator [] в неконстантном контейнере. И, возможно, у вас есть текущее требование для функции get, которая возвращает созданный по умолчанию объект; Я знаю, что у меня было это требование в прошлом.