Параллельность :: combinable / c ++ - PullRequest
0 голосов
/ 18 декабря 2011

это код, который вычисляет факториал произвольного числа:

unsigned long long factorial(int n)
{
  Concurrency::combinable<unsigned long long> products=Concurrency::combinable<unsigned long long>([]()->unsigned long long{return 1LL;});
  Concurrency::parallel_for(1, n+1, [&products](int i){products.local() *= i;});
  return products.combine([](unsigned long long lProduct, unsigned long long rProduct){ return lProduct*rProduct;  });
}

Можете ли вы объяснить мне:

    • что означает ()->? я думаю () функтор, но какого класса? и почему там ->?
    • что такое 1LL?

Ответы [ 2 ]

2 голосов
/ 18 декабря 2011

[]()->unsigned long long{return 1LL;} - анонимная лямбда-функция, возвращающая long без знака.Суффикс LL указывает, что литеральное значение равно long long, а не int.

1 голос
/ 18 декабря 2011

->unsigned long long объявляет тип возвращаемого значения лямбда-функции.

Вы можете зайти на Google C ++ лямбда для получения дополнительной информации, но базовый синтаксис выглядит примерно так:

[capture_mode] (formal_parameters) mutable -> return_type {body}

1LL в основном совпадает с static_cast<long long>(1).1 - это int, 1LL - это long long.

Однако, более короткий способ написать это было бы:

Concurrency::combinable([]{return 1ULL;});

Где должны быть типыавтоматически выводится.Обратите внимание, что я использовал ULL вместо LL, чтобы сделать его длинным без знака, как в исходном коде.

...