Среда, 18 Декабря 2024, 07:36

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 4 из 4
  • «
  • 1
  • 2
  • 3
  • 4
Результаты поиска
JhonДата: Воскресенье, 17 Мая 2015, 10:54 | Сообщение # 61 | Тема: GearArkanoid (предыдущее название AnotherArkanoid)
частый гость
Сейчас нет на сайте
Идея очень крутая, но основная игровая область очень маленькая. Пространство с кирпичами занимает меньше 10% экрана, на мобильных платформах вообще практически ничего не будет видно.
JhonДата: Пятница, 15 Мая 2015, 08:56 | Сообщение # 62 | Тема: Как вы относитесь к лямбда-выражениям?
частый гость
Сейчас нет на сайте
Цитата Archido ()
Большая часть этих "нововведений" прямиком (или идеей) переехала из буста:) Конечно стало поудобнее, но и раньше все это было вполне доступно:)

Из этого следует, что опытным программистам на C++ сразу знаком новый стандарт, если они были знакомы с бустом. Но новичкам от этого не проще, тут соглашусь с Saitei.
С другой стороны, раньше тоже значительная часть людей отфильтровывалась из-за проблем со всеми этими звездочками и амперсандами. Если человек прошел этот этап, то всякие "auto l = [](){};" его также не испугают. Если не прошел, то ему либо уже все равно, либо новый стандарт поможет с ними справиться (те же умные указатели, как обертка над простыми указателями, облегчающая управление памятью, std::function, как обертка над указателями на функции и т.д.).
Да и любой язык (популярный) развивается. Вон в Java8 добавили лямбды и Stream API - все только рады.
JhonДата: Четверг, 07 Мая 2015, 23:56 | Сообщение # 63 | Тема: Как вы относитесь к лямбда-выражениям?
частый гость
Сейчас нет на сайте
Лямбды в С++ - это просто синтаксический сахар для функторов (функциональных объектов, объектов с перегруженным operator() (оператор "круглые скобки")). Стало быть применять их можно там же, где и функторы. А функторы - там же, где и указатели на функции. Это все об одном и том же примерно.

1) Первое преимущество функциональных объектов (и лямбд) в том, что у них есть состояние (хотя чистые функциональные языки считают изменяемое состояние недостатком, но у них вообще другая парадигма, другие проблемы и другие решения для них).

Например:
Код
auto getCounter = [](int initialValue) {
     return [initialValue]() mutable {
         return initialValue--;
     };
};

auto c = getCounter(5);

while (c()) {
     std::cout << "Hello lambda" << std::endl;
}


Это эквивалентно созданию функтора:
Код
class Counter {
     int m_state;
public:
     Counter(int initialValue) : m_state(initialValue) {}
     int operator()() {
         return m_state--;
     }
};

Counter getCounter(int initialValue) {
     return Counter(initialValue);
}

Counter c = getCounter(5);

while (c()) {  
      std::cout << "Hello lambda" << std::endl;  
}  


2) Лямбды анонимны и не засоряют пространство имен. Если нужно куда-то передать функцию/функтор, иногда нет смысла давать ей имя, если она всего один раз используется.
Тут уже приводили пример:
Цитата Saitei ()
std::sort(v.begin(), v.end(), [](auto a, auto b) { return abs(a)<abs(b); });


3) Лямбды можно куда-то передавать, добавлять в какие-то контейнеры, передавать обработчикам, которые будут выполнять их в другом потоке. Например, есть какой-то обработчик SQL-запросов, куда из разных потоков отправляются запросы, а он их выполняет последовательно, предотвращая коллизии.

4) Лямбды могут синтаксически замыкать контекст. Например можно взять по ссылке переменную из окружения двух лямбд и использовать ее как разделяемую память. А сами лямбды передать обработчику для асинхронного выполнения. Тогда следующая лямбда может понять, выполнилась ли первая и использовать ее результат.
Код
int result = 0;
sequencer->addTask( [&result, this]() {
     result = doSomething();
});
sequencer->addTask( [&result, this]() {
     if (result) {
         // everything is ok, we can process result
     }
});
  • Страница 4 из 4
  • «
  • 1
  • 2
  • 3
  • 4
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг