Pull to refresh

Comments 26

Компилировать это всё, как и водится, надо с ключом -std=c++0x или -std=c++0x
Ну или -std=c++0x на крайний случай :)
Я не знаток g++, но «c++0x» вроде бы сейчас не развивается и лучше использовать c++11?
Для gcc это синонимы, вариант -std=c++11 был введен с версии 4.7.
Еще про «gnu++11» ничего не было сказано…
Благо, у нас в Ivideon лояльно относятся к новым технологиям и дают пробовать что-то новое.

Возьмите меня к себе!

С удовольствием! всегда рады хорошим разработчикам в нашей команде! Приходите!
Зачем запускать по треду на анимацию? Почему не использовать event loop UI-потока, раз уж у вас все равно Qt.
Я хотел разграничить собственно анимацию и рендер. В GUI-потоке пусть работает рендер.
Разумно, но не по потоку же на анимацию. Один animation-тред, ну или пул, если нужно.
UFO just landed and posted this here
с QtConcurrent:run выражения с лямбдами не испытывал проблем на Qt5, а вот с mapped действительно есть проблемы, даже до сих пор
Недавно я решил узнать, что же есть новенького в плане поддержки C++11 компилятором GCC, и понял, что пора начинать.

GCC и Clang уже давно поддерживают 11-ый стандарт, основная проблема с майкрософтовским компилятором, где и поддержка появляется небыстро и надо ставить новую студию, что делают далеко не все.
typedef std::function<bool(float)> actor_func;

Раз уж взялись за новый стандарт — имеет смысл сразу использовать using. В данном случае все будет полностью эквивалентно, но так как using более мощное средство, то для единообразия имеет смысл использовать его.
С чем связан выбор именно -std=c++11, а не -std=gnu++1y (C++14 с GNU Extensions), или например c++1y (просто C++14) или gnu++11 (C++11 c GNU)? GCC весьма неплохо поддерживает их все.
Вы напрасно используете std::function там, где он не требуется.
> [=] означает захват по значению всех доступных переменных
Выглядит сомнительно, что значит «всех»?
Рискну ответить за автора. «Всех» — это тех, которые доступны в области видимости лямбды.
Спасибо. Да, захватываются переменные из области видимости, актуальной в момент создания лямбды.
Захватываются лишь те переменные, которые используются в теле лямбда-выражения. Захват всего видимого по значению был бы потенциально слишком дорог.
И действительно. Поправил текст.
На счёт std::function, я говорю про следующее, std::function нигде не сохраняется и его конструирование из замыкания является избыточным, и дорогим, поскольку это type-erasure (полиморфизм, динамическое выделение памяти в конструкторе).

Я бы перенес функцию в заголовочный файл, сменив сигнатуру на:
template<typename ActorFunc, typename HandlerFunc> void start(unsigned intervalMs, ActorFunc&& actor, HandlerFunc&& handler)

Таким образом, мы избавляемся от лишнего конструирования и копирования std::function, если фактическим аргументом является замыкание.

Конечно, поспорить можно, в данном случае для пользователя отсутствует подсказка о том, какие требования накладываются на типы ActorFunc/HandlerFunc, но современные компиляторы выдадут вполне адекватное сообщение об ошибке, если что-то пойдет не так.
UFO just landed and posted this here
UFO just landed and posted this here
Наверное не понял, о чем речь. В приведённых вариантах не было явного указателя на функцию, только функциональные объекты (std:: function и непосредственно замыкание). Если рассуждать абстрактно, и вариант с T&&, и с указателем на функцию могут быть заинлайнены, но так как замыкание обычно что-то захватывает и сначала его сконструировать
В общем из-за конструирования замыкания может быть медленнее, насколько медленнее — зависит от захватымаемых сущностей.
P.S. В андроид-приложении можно редактировать комментарии?
Sign up to leave a comment.