- 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 на такие переменные, не отказываясь при этом от свитчей!
ШТОЭТА? Плюсы скатываются в перл?
Раз уж получил в наследство от других говнокодеров проект под студию 2010 - грех не отыграться.
лямбды -- отличный способ писать нечитаемый говнокод, но например по linq, var и extension methods из C# ему далеко.
так что С++ еще некоторое время останется заповедником адекватов в море говнокодерства
Поржал.
В рядах смайликов пополняется.)
бля. чо они делают со стандартами, а?
А внизу (справа) это чьи-то яйца около рта? *ROFL*
А теперь внимание, вопрос знатокам: Чьи?
Счёт 7:0 в пользу телезрителей.
Скорее смайл обозначает охуевшего кодера с квадратными глазами, после того как он успешно прострелил себе ногу из С++рокетленчера.
Поправте меня, если я сказал что-то не верно. Не довелось пока поработать с компилятором нового стандарта.
И так вопрос:
1)Что в данном случае const StringId?
2)Где говнокод? В 17ой строчке? - это объявление лямбда-функции sidPathName без параметров с замыканием на локальные переменные по значению. Эта функция возвращает тип const char* const.
typedef std::string StringId;
Подсистема локализации перекочевала из другого проекта с другим движком, где для этого дела была парочка дополнительных оптимизаций, но здесь пока не до них.
2) Я ещё сам до сих пор пытаюсь понять, насколько это говнокод. В данном конкретном случае можно было бы привычно обойтись выборкой нужной строки из локального статического массива констант, но несколько напрягает необходимость каждый раз отнимать единицу от значения из enum, чтобы получить индекс (0 там называется PATH_NOT_CHOSEN и валидным значением в данном случае не является, всё остальное идёт по порядку).
Вопрос не про данный конкретный проект, а про лямбды. Что в данном случае означает тип 'const StringId' с точки зрения семантики лямбд в С++?
Если точнее, в данном случае происходит неявная передача этого значения в конструктор std::string, но не суть.
Наличие лямбды справа от знака равенства семантику данного выражения меняет... ну, собственно, вообще никак не меняет.
Ваш кэп.
По 0-му индексу можно засунуть фейковое значение ("" или NULL), если лень единицу отнимать. Но делать так не следует. Ведь никто не гарантирует, что значения энумов не изменятся. Лучше превратить лямбду в обычную именованную функцию. А ещё лучше -- вынести такие ресурсы во внешний файл данных.
Функцию сделал бы именованной, если бы она использовалась более чем в одном месте, в данном случае - это просто единичный кусок кода загрузки и разбора XML с некоторыми данными.
Теперь ясно, что не прав. Лямбда-функция безымянная.
А присвоить её адрес переменной, сохранив оператор (), можно только двумя (известными мне) способами: через новое значение ключевого слова auto (т.к. нормального типа у неё нет, а тот, что есть - известен только компилятору), либо обернув в стыренную из буста std::function.
Ну это я и имел ввиду под именованной лямбдой. Некорректно выразился...
Разве лямбда не имеет тип функции или указателя на функцию? Если не имеет, то почему? Чем руководствовались создатели стандарта?
Поясните, пожалуйста, это высказывание.
"Заставь дурака Богу молиться, он и лоб разобьёт."
1) сохранение константности (навеяно рефакторингом говнокода, в котором повсеместно применялся const_cast для передачи константного указателя в функцию, ожидающую неконстантного, при том что этой функции его неконстантность реально была нафиг не нужна);
2) чтобы самому увидеть, как же это извращение будет смотреться (результатом удовлетворён).
где теряется конст, если делать вот так?
А заинлайнить лямбду компилятор и сам додумается, если не тупой.
Во всяком случае, комбинация std::for_each с лямбдой на простом цикле по вектору 10-й студией в релизе разворачивается гораздо лучше, чем тот же цикл на итераторах. А то же самое через оператор [] вообще выдаёт войну и мир в дизасме.
Видимо, придётся смириться с тем фактом, что M$ более не поощряет написание кода, понятного даже школьнику.
Ну и чем не подошёл? Поведение программы в релизе в случае ошибки хорошее...
Во всяком случае, это лучше, чем то, что будет в варианте со статическим массивом констант, если кто-то втихаря поменяет местами идентификаторы в enum.
Тут всеж лучше падение программы с построением багрепорта, а не тихое замалчивание ошибки.
А логи, баг-репорты и собственно ассерты есть в дебаге.
Да, кстати, в прошлых наших проектах было три конфигурации: debug, release и final. В релизе, благодаря включённым оптимизациям, было меньше тормозов, но логи и читы не отключались, а ассерты писали себя в лог, не прерывая выполнения. Финал же (с отключённым всем) собирался только для бета-тестов, окончательных релизов и т.п.
Конечно ему больше понравятся глюки и не верные результаты работы программы, чем возможность получить исправленную версию продукта, в случае наличия ошибки. :D
ТарасБ фшоке.
уже джва года
http://8vmr.livejournal.com/6114.html
и при этом выглядит не как говно.
Эти новые фишечки похоронят С++ под горой нечитаемого символьного мусора.
>Эти новые фишечки похоронят С++ под горой нечитаемого символьного мусора.
В кои-то веки полностью соглашусь с мнением сего господина.
namespace boost {
namespace detail { struct none_helper{}; }
typedef int detail::none_helper::*none_t ;
} // namespace boost