launchRange
- это шаблон функции, а не функция.
Вы не можете передать шаблон функции как функцию, если не было выполнено разрешение перегрузки.Эта строка не вызывает разрешение перегрузки.
auto launchRange = [](int id, auto&& func, int k1, int k2)
{
for (int k = k1; k < k2; k++) {
func(k);
}
};
Выше приведена лямбда, которая во многом похожа на шаблон launchRange
, но это фактический объект, а не просто шаблон.
Это все равно не будет работать, потому что вы не передаете add
аргумент id
.
poolPtr->add(launchRange, 77, func, i1, i2);
, который, вероятно, скомпилируется.
Мне это не особо нравитсяконкретная реализация пула потоков.Я имею в виду, сколько бессмысленных слоев прыщей вы можете иметь?Сколько бессмысленного выделения кучи?И это проходит по ссылке по умолчанию , что является ужасной идеей при передаче материала в другой поток.
Я бы сказал, что принятие аргументов - это плохой план.Избегайте их использования.
poolPtr->add([=]{ launchRange(77, func, i1, i2); });
, что также устраняет необходимость создания auto launchRange = []
лямбда.А ошибки в итоге становятся намного проще для чтения.