- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
const StringId sidPathName = [=]() -> const char* const
{
switch (path)
{
case PATH_TOWN_HERO:
return "game/careers/town_hero";
case PATH_MAD_SCIENTIST:
return "game/careers/mad_scientist";
case PATH_SPECIAL_AGENT:
return "game/careers/special_agent";
case PATH_PSYCHIC_PAINTER:
return "game/careers/psychic_painter";
default:
RZT_ASSERT(false);
return "";
}
}();
Не удержался: давно мечтал о возможности ставить const на такие переменные, не отказываясь при этом от свитчей!
gegMOPO4 21.02.2011 18:39 # +5
guest 22.02.2011 02:15 # +2
byss 21.02.2011 19:52 # +2
ШТОЭТА? Плюсы скатываются в перл?
Kirinyale 21.02.2011 19:54 # +4
Раз уж получил в наследство от других говнокодеров проект под студию 2010 - грех не отыграться.
byss 21.02.2011 20:03 # 0
Kirinyale 21.02.2011 20:04 # 0
byss 21.02.2011 20:33 # 0
Анонимус 21.02.2011 21:14 # +1
лямбды -- отличный способ писать нечитаемый говнокод, но например по linq, var и extension methods из C# ему далеко.
так что С++ еще некоторое время останется заповедником адекватов в море говнокодерства
koodeer 21.02.2011 21:22 # +1
Поржал.
Анонимус 21.02.2011 21:24 # +8
k06a 02.03.2011 00:10 # 0
Kirinyale 02.03.2011 19:14 # 0
guest 21.02.2011 21:34 # 0
В рядах смайликов пополняется.)
Kirinyale 21.02.2011 22:57 # 0
Kirinyale 21.02.2011 22:58 # 0
brainstorm 21.02.2011 23:08 # +4
бля. чо они делают со стандартами, а?
guest 21.02.2011 23:16 # −1
А внизу (справа) это чьи-то яйца около рта? *ROFL*
А теперь внимание, вопрос знатокам: Чьи?
Kirinyale 21.02.2011 23:29 # 0
guest 21.02.2011 23:31 # −1
guest 21.02.2011 23:34 # +1
Kirinyale 21.02.2011 23:42 # 0
Lure Of Chaos 21.02.2011 23:45 # 0
guest 21.02.2011 23:59 # −1
Счёт 7:0 в пользу телезрителей.
Kirinyale 21.02.2011 23:57 # 0
guest 22.02.2011 12:08 # 0
Скорее смайл обозначает охуевшего кодера с квадратными глазами, после того как он успешно прострелил себе ногу из С++рокетленчера.
brainstorm 22.02.2011 12:10 # 0
guest 21.02.2011 21:21 # 0
Поправте меня, если я сказал что-то не верно. Не довелось пока поработать с компилятором нового стандарта.
И так вопрос:
1)Что в данном случае const StringId?
2)Где говнокод? В 17ой строчке? - это объявление лямбда-функции sidPathName без параметров с замыканием на локальные переменные по значению. Эта функция возвращает тип const char* const.
Kirinyale 21.02.2011 21:27 # 0
typedef std::string StringId;
Подсистема локализации перекочевала из другого проекта с другим движком, где для этого дела была парочка дополнительных оптимизаций, но здесь пока не до них.
2) Я ещё сам до сих пор пытаюсь понять, насколько это говнокод. В данном конкретном случае можно было бы привычно обойтись выборкой нужной строки из локального статического массива констант, но несколько напрягает необходимость каждый раз отнимать единицу от значения из enum, чтобы получить индекс (0 там называется PATH_NOT_CHOSEN и валидным значением в данном случае не является, всё остальное идёт по порядку).
guest 21.02.2011 21:32 # 0
Вопрос не про данный конкретный проект, а про лямбды. Что в данном случае означает тип 'const StringId' с точки зрения семантики лямбд в С++?
Kirinyale 21.02.2011 22:55 # 0
Если точнее, в данном случае происходит неявная передача этого значения в конструктор std::string, но не суть.
Наличие лямбды справа от знака равенства семантику данного выражения меняет... ну, собственно, вообще никак не меняет.
Ваш кэп.
guest 21.02.2011 22:58 # −1
gegMOPO4 22.02.2011 12:41 # 0
По 0-му индексу можно засунуть фейковое значение ("" или NULL), если лень единицу отнимать. Но делать так не следует. Ведь никто не гарантирует, что значения энумов не изменятся. Лучше превратить лямбду в обычную именованную функцию. А ещё лучше -- вынести такие ресурсы во внешний файл данных.
Kirinyale 22.02.2011 12:51 # 0
Функцию сделал бы именованной, если бы она использовалась более чем в одном месте, в данном случае - это просто единичный кусок кода загрузки и разбора XML с некоторыми данными.
gegMOPO4 26.02.2011 11:05 # 0
guest 21.02.2011 23:02 # −1
Теперь ясно, что не прав. Лямбда-функция безымянная.
Kirinyale 21.02.2011 23:38 # 0
А присвоить её адрес переменной, сохранив оператор (), можно только двумя (известными мне) способами: через новое значение ключевого слова auto (т.к. нормального типа у неё нет, а тот, что есть - известен только компилятору), либо обернув в стыренную из буста std::function.
guest 21.02.2011 23:42 # −1
Ну это я и имел ввиду под именованной лямбдой. Некорректно выразился...
guest 22.02.2011 02:18 # −1
Разве лямбда не имеет тип функции или указателя на функцию? Если не имеет, то почему? Чем руководствовались создатели стандарта?
Kirinyale 22.02.2011 02:23 # 0
guest 21.02.2011 23:04 # 0
Поясните, пожалуйста, это высказывание.
Kirinyale 21.02.2011 23:36 # 0
guest 21.02.2011 23:39 # 0
"Заставь дурака Богу молиться, он и лоб разобьёт."
Kirinyale 21.02.2011 23:47 # 0
1) сохранение константности (навеяно рефакторингом говнокода, в котором повсеместно применялся const_cast для передачи константного указателя в функцию, ожидающую неконстантного, при том что этой функции его неконстантность реально была нафиг не нужна);
2) чтобы самому увидеть, как же это извращение будет смотреться (результатом удовлетворён).
guest 22.02.2011 00:04 # 0
Kirinyale 22.02.2011 00:08 # 0
Govnoeb 22.02.2011 01:07 # 0
где теряется конст, если делать вот так?
Kirinyale 22.02.2011 01:15 # −1
А заинлайнить лямбду компилятор и сам додумается, если не тупой.
Во всяком случае, комбинация std::for_each с лямбдой на простом цикле по вектору 10-й студией в релизе разворачивается гораздо лучше, чем тот же цикл на итераторах. А то же самое через оператор [] вообще выдаёт войну и мир в дизасме.
Видимо, придётся смириться с тем фактом, что M$ более не поощряет написание кода, понятного даже школьнику.
guest 21.02.2011 23:08 # −1
Ну и чем не подошёл? Поведение программы в релизе в случае ошибки хорошее...
Kirinyale 21.02.2011 23:41 # 0
Во всяком случае, это лучше, чем то, что будет в варианте со статическим массивом констант, если кто-то втихаря поменяет местами идентификаторы в enum.
guest 21.02.2011 23:44 # −1
Тут всеж лучше падение программы с построением багрепорта, а не тихое замалчивание ошибки.
Kirinyale 21.02.2011 23:52 # +1
А логи, баг-репорты и собственно ассерты есть в дебаге.
Да, кстати, в прошлых наших проектах было три конфигурации: debug, release и final. В релизе, благодаря включённым оптимизациям, было меньше тормозов, но логи и читы не отключались, а ассерты писали себя в лог, не прерывая выполнения. Финал же (с отключённым всем) собирался только для бета-тестов, окончательных релизов и т.п.
guest 22.02.2011 00:02 # −1
Конечно ему больше понравятся глюки и не верные результаты работы программы, чем возможность получить исправленную версию продукта, в случае наличия ошибки. :D
Kirinyale 22.02.2011 00:06 # 0
TarasB 22.02.2011 00:12 # +4
ТарасБ фшоке.
guest 22.02.2011 00:14 # 0
Lure Of Chaos 22.02.2011 00:21 # +8
Kirinyale 22.02.2011 00:25 # 0
TarasB 22.02.2011 10:19 # +2
уже джва года
http://8vmr.livejournal.com/6114.html
и при этом выглядит не как говно.
Эти новые фишечки похоронят С++ под горой нечитаемого символьного мусора.
guest 22.02.2011 12:15 # +5
3.14159265 02.03.2011 21:05 # 0
>Эти новые фишечки похоронят С++ под горой нечитаемого символьного мусора.
В кои-то веки полностью соглашусь с мнением сего господина.
Kirinyale 22.02.2011 00:36 # 0
namespace boost {
namespace detail { struct none_helper{}; }
typedef int detail::none_helper::*none_t ;
} // namespace boost
brainstorm 22.02.2011 03:39 # 0
Kilotonne 22.02.2011 03:56 # 0
TarasB 22.02.2011 10:20 # −1