@Eugene-123

Как добавить в `std::map` объект с константными полями?

Допустим у меня есть следующий код:
#include <string>
#include <map>

struct A {
    const int value;
    A(int value) : value{value} {}
};

int main() {
    A a{3};
    std::map<std::string, A> myMap;
    myMap["Hello"] = a; // Error: Copy assignment operator of 'A' is implicitly deleted 
                        // because field 'value' is of const-qualified type 'const int'.
    return 0;
}

В данном случае я не могу перегрузить `operator=`

Мне нужно следующее поведение.
1. Поле const int value - константно всегда. Никаких трюков чтобы его изменить.
2. std::map должен содержать значения.
3. Если ключ отсутствует, то должна создаваться пара ключ-значение в map.
4. Если ключ существует, то заменить значение.
5. Никаких конструкторов по умолчанию, в случае отсутствия ключа. Доступ к словарю, с использованием ключа, которого нет, должно вызывать исключение или остановку или еще что-то.

В общем как я понимаю надо создать обертку над std::map? Хотелось бы такого поведения достичь стандартными средствами std::map. Что вы предложите?
  • Вопрос задан
  • 138 просмотров
Решения вопроса 1
@Eugene-123 Автор вопроса
Я тут нашел решение, которое мне подходит:
int main() {
    A a{3};
    std::map<std::string, A> myMap;
    const char* key = "Hello";
    const auto it = myMap.find(key);
    if (it != myMap.end())
        myMap.erase(it);
    myMap.emplace(key, a.value);
    return 0;
}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
maaGames
@maaGames
Погроммирую программы
А вот сделали бы переменную в private и константный метод для возврата значения и вообще никаких проблем бы не было.
Ответ написан
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
Храните в std::map указатели на ваш тип. Лучше умные, вроде shared_ptr.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы