
Alexander
16.10.2017
13:50:20
я бы написал проще - обёртку над мапой, которая при отсутсвтии значения вернёт сделает то, что нужно
что ж поделать, что нет у нас default значения как параметр

Evgeniy
16.10.2017
13:51:56

Alexander
16.10.2017
13:52:12

Google

Evgeniy
16.10.2017
13:52:31
но криво же

Alexander
16.10.2017
13:52:44
только написать это более обощённо и запихунть в свой утилити лайбрари
а что делать, что дефолта нет у нас. ЕМНИП, есть пропозал об этом

Evgeniy
16.10.2017
13:58:06

Constantine
16.10.2017
13:59:27
а что мешает написать ручками get_with_default для const& мапы?

Alexander
16.10.2017
13:59:37

Constantine
16.10.2017
14:00:12
я не про стандарт, это вроде как нештатное использование для std::map

Pepe
16.10.2017
14:00:21

Constantine
16.10.2017
14:00:59
некрасиво же)
некрасиво что? имхо внешние функции с унифицированными отглагольными именами являются лучшей архитектурой в природе

Alexander
16.10.2017
14:01:40

Evgeniy
16.10.2017
14:01:47

Alexander
16.10.2017
14:02:11
принимает контейнер и дефолт значение

Google

Alexander
16.10.2017
14:02:42
а там внутри пусть ищёт.

Berkus
16.10.2017
14:02:49

Anatoly
16.10.2017
14:02:50

Igor
16.10.2017
14:03:00

Constantine
16.10.2017
14:03:03

Alexander
16.10.2017
14:03:11

Constantine
16.10.2017
14:03:16
is_null (создано по конструктору из nullptr), get, get_or_default, ...

Alexander
16.10.2017
14:03:31

Constantine
16.10.2017
14:03:40
is_null_or_true
а что, мапе завезли подмену default конструктора элемента?

Alexander
16.10.2017
14:04:45
нет

Evgeniy
16.10.2017
14:04:49

Constantine
16.10.2017
14:05:07
а почему нельзя этот конструктор объявить конструктором класса?
все равно это часть информации о ТИПЕ мапы

Alexander
16.10.2017
14:05:21

Constantine
16.10.2017
14:05:29
наследуй если не твой

Alexander
16.10.2017
14:05:39
а я не хочу, потому что оверкилл, очевидно

Constantine
16.10.2017
14:05:59
почему? это strict type alias, в C++ он без наследования не реализуется
а ты хочешь фабрику шаблонным параметром мапы?
это не оверкилл?

Google

Evgeniy
16.10.2017
14:06:18
блин мне надо всего лишь замапить класс к интам от 0 и возвращать -1 если в мапе такого нет

Дед Пегас
16.10.2017
14:06:26
:D

Alexander
16.10.2017
14:06:35

Constantine
16.10.2017
14:06:56
ну get_or_default(std::map<smth, int> const& mp, int default)

Дед Пегас
16.10.2017
14:06:58

Alexander
16.10.2017
14:07:47

Evgeniy
16.10.2017
14:08:04
к этому и пришел

Constantine
16.10.2017
14:08:28

Alexander
16.10.2017
14:08:40

Tema
16.10.2017
14:08:50

Constantine
16.10.2017
14:08:53

Constantine
16.10.2017
14:09:00
то же самое, что key_set в std не запихали, кстати

Tema
16.10.2017
14:09:05
ибо -1 это тоже может быть коректным клюдчём в енуме же

Evgeniy
16.10.2017
14:09:27

Constantine
16.10.2017
14:09:38

Alexander
16.10.2017
14:09:58

Constantine
16.10.2017
14:10:02
потому что map<int, smth> значение типа smth не может быть шаблонным параметром

Alexander
16.10.2017
14:10:07
вот шаблоном я бы точно не хотел, наверное

Constantine
16.10.2017
14:10:14
+

Google

Alexander
16.10.2017
14:10:23
мапы с разными дефолтами - разные типы. нет уж, извольте

Evgeniy
16.10.2017
14:10:28
ну или параметром конструктора

Alexander
16.10.2017
14:10:31
с аллокаторами уже имеем такое

Evgeniy
16.10.2017
14:10:38
погорячился

Alexander
16.10.2017
14:10:45
я бы всё же метод хотел

Constantine
16.10.2017
14:10:52
параметром только конструктора фабрика быть не может, её тип не определен

Alexander
16.10.2017
14:11:01
ну а лучше всего - своболдная функция + UFCS

Admin
ERROR: S client not available

Anatoly
16.10.2017
14:11:57
функция тоже есть, но она модифирующая try_emplace. в С++17 завезли.

Evgeniy
16.10.2017
14:12:47

Anatoly
16.10.2017
14:12:55
пару

Evgeniy
16.10.2017
14:13:34
как-то некрасиво все равно
☹️

Constantine
16.10.2017
14:14:16
а вообще я в архитектуре за унифицированные внешние отглагольные функции)
т.е. моя реализация
template <typename A, typename V [, ...]>
V get_or_default(std::map<A, V> const& mp, A const& a, V v = {}) {
auto it = mp.find(a);
if (it != mp.end())
return it->second;
return v;
}
вот так, видимо

Anatoly
16.10.2017
14:14:55

Constantine
16.10.2017
14:15:08

Anatoly
16.10.2017
14:15:14
поскольку, нечаянный m["key"] не вернет -1

Constantine
16.10.2017
14:15:41
m["key"] не const

Google

Constantine
16.10.2017
14:15:49
но если речь о том, что нужно перекрыть этот случай, выбора кроме агрегации/наследования просто нет

Anatoly
16.10.2017
14:16:06
или надо написать "хочешь получить значение мапы, но только через get_or_default"

Constantine
16.10.2017
14:16:07
потому что нужно новый тип мапы вывести
если это основной способ обращения - пишем type alias через агрегацию
больше путей в С++ не завезли

Anatoly
16.10.2017
14:17:11
Костя, ну вот есть пример у Страуструпа о подсчете числа вхождения слов. Все лаконично.
Кто-то хочет, чтобы добавление нового ключа через тот же оператор [] приводило к инициализации значения пары определенным значением. Вполне себе легальное желание.

Alexander
16.10.2017
14:17:47

Berkus
16.10.2017
14:19:58

Anatoly
16.10.2017
14:20:42

Alexander
16.10.2017
14:21:21
а, ясно-понятно

Constantine
16.10.2017
14:26:04
std::map<std::string, size_t> m;
string s;
while (cin >> s) ++m[s];
типичный олимпиадных исходник

Evgeniy
16.10.2017
14:27:52

Anatoly
16.10.2017
14:35:28
Ребят, так что на счет легальности?
еще можно через аллокатор кастомный, я пример набросал: https://ideone.com/Ui86F6

Constantine
16.10.2017
14:54:03
а всякие emplace таким аллокатором не ломаются?
на глаз очень не нравится
template <typename U, typename...Args>
void construct(U* ptr, Args&&... args) {
alloc_traits::construct(static_cast<A&>(*this),
ptr, std::forward<Args>(args)...);
initializer<U>::init(ptr);
}

Anatoly
16.10.2017
15:08:41