1. C++ / Говнокод #15699

    +9

    1. 1
    #define  FindElem( L )   _FindElem( [=] (VEC4 iter) -> bool  {  return (L);  } )

    На что только не пойдут люди, чтобы писать

    VEC4* pv = vecs.FindElem( iter.x==1.0f );

    Запостил: laMer007, 07 Апреля 2014

    Комментарии (16) RSS

    • ну вот, краткость лямбд теперь и в крестах.
      Ответить
    • На первый взгляд не так страшно. Но я бы сделал больший акцент, что это именно макрос.
      Ответить
      • Я бы ещё сделал акцент на ненужном захвате вообще всего по значению. Надежда на оптимизации компилятора.
        Ответить
    • > iter.x==1.0f
      так действительно кто-то написал? :)
      Ответить
    • Это еще фигня... Вот в ускорение::феникс можно писать vecs.FindElem(_1.x == 1.0f)... И без всяких макросов ;)
      Ответить
      • Нет, не получается :(

        _1.x не будет работать.
        Ответить
        • Конечно, не будет.
          В крестах пока-ещё нельзя преобразовать вызов метода в ноду синтаксического дерева.
          Ответить
        • > _1.x не будет работать.
          Наверное как-то так:
          using namespace ::boost::phoenix;
          using namespace arg_names;
          vecs.FindElem(bind(&VEC4::x, arg1) == 1.0f);
          Ответить
      • >ускорение::феникс
        Лол, Тараса заманиваешь на бустятинку?
        Ответить
    • Ещё мысль: добавить в макрос аргумент, который задает имя переменной (вместо дефолтного iter). А то iter как-то выглядит возникающим из ниоткуда.
      Ответить
      • > iter как-то выглядит возникающим из ниоткуда
        Так вот вы какие, анафорические лямбды

        для подобных целей принятно использовать магический символ it (в groovy, например)
        Ответить

    Добавить комментарий