Comments 26
Компилировать это всё, как и водится, надо с ключом -std=c++0x или -std=c++0xНу или -std=c++0x на крайний случай :)
+19
Благо, у нас в Ivideon лояльно относятся к новым технологиям и дают пробовать что-то новое.
Возьмите меня к себе!
+8
С удовольствием! всегда рады хорошим разработчикам в нашей команде! Приходите!
+4
Зачем запускать по треду на анимацию? Почему не использовать event loop UI-потока, раз уж у вас все равно Qt.
+5
Я хотел разграничить собственно анимацию и рендер. В GUI-потоке пусть работает рендер.
-1
Недавно я решил узнать, что же есть новенького в плане поддержки C++11 компилятором GCC, и понял, что пора начинать.
GCC и Clang уже давно поддерживают 11-ый стандарт, основная проблема с майкрософтовским компилятором, где и поддержка появляется небыстро и надо ставить новую студию, что делают далеко не все.
typedef std::function<bool(float)> actor_func;
Раз уж взялись за новый стандарт — имеет смысл сразу использовать using. В данном случае все будет полностью эквивалентно, но так как using более мощное средство, то для единообразия имеет смысл использовать его.
+3
С чем связан выбор именно -std=c++11, а не -std=gnu++1y (C++14 с GNU Extensions), или например c++1y (просто C++14) или gnu++11 (C++11 c GNU)? GCC весьма неплохо поддерживает их все.
0
Не хотелось бы привязываться к гнутым расширениям. А C++14 поддерживается GCC лишь частично.
-1
Вы напрасно используете std::function там, где он не требуется.
> [=] означает захват по значению всех доступных переменных
Выглядит сомнительно, что значит «всех»?
> [=] означает захват по значению всех доступных переменных
Выглядит сомнительно, что значит «всех»?
+1
На счёт std::function, я говорю про следующее, std::function нигде не сохраняется и его конструирование из замыкания является избыточным, и дорогим, поскольку это type-erasure (полиморфизм, динамическое выделение памяти в конструкторе).
Я бы перенес функцию в заголовочный файл, сменив сигнатуру на:
template<typename ActorFunc, typename HandlerFunc> void start(unsigned intervalMs, ActorFunc&& actor, HandlerFunc&& handler)
Таким образом, мы избавляемся от лишнего конструирования и копирования std::function, если фактическим аргументом является замыкание.
Конечно, поспорить можно, в данном случае для пользователя отсутствует подсказка о том, какие требования накладываются на типы ActorFunc/HandlerFunc, но современные компиляторы выдадут вполне адекватное сообщение об ошибке, если что-то пойдет не так.
Я бы перенес функцию в заголовочный файл, сменив сигнатуру на:
template<typename ActorFunc, typename HandlerFunc> void start(unsigned intervalMs, ActorFunc&& actor, HandlerFunc&& handler)
Таким образом, мы избавляемся от лишнего конструирования и копирования std::function, если фактическим аргументом является замыкание.
Конечно, поспорить можно, в данном случае для пользователя отсутствует подсказка о том, какие требования накладываются на типы ActorFunc/HandlerFunc, но современные компиляторы выдадут вполне адекватное сообщение об ошибке, если что-то пойдет не так.
+3
UFO just landed and posted this here
UFO just landed and posted this here
Наверное не понял, о чем речь. В приведённых вариантах не было явного указателя на функцию, только функциональные объекты (std:: function и непосредственно замыкание). Если рассуждать абстрактно, и вариант с T&&, и с указателем на функцию могут быть заинлайнены, но так как замыкание обычно что-то захватывает и сначала его сконструировать
0
Sign up to leave a comment.
Анимации на лямбдах в C++11