Получить типы классов для шаблонов

У меня есть функция шаблона, как это:

template<class RandomAccessIterator, class T, class Func>
T reduce(RandomAccessIterator first, RandomAccessIterator last, const T& initial_value, Func func) {
    // Some code;
    return cur_value;
}

Я не могу начать тему с:

std::thread t1(reduce, iterator1, iterator2, 0, sum)

Так как reduce функция не создана из-за template поведение. Я должен написать вручную все типы, определенные в template, Подобно:

std::thread t1(reduce<SomeIterator, SomeNumber, SomeFunc>, iterator1, iterator2, 0, sum)

Если у меня есть другие типы, я должен написать:

std::thread t1(reduce<AnotherIterator, AnotherNumber, Func>, iterator1, iterator2, 0, sum)

Как я могу автоматизировать этот процесс? Есть ли метод для расчета типов классов, таких как:

std::thread t1(reduce<typeof(X), typeof(Y), typeof(Z)>, iterator1, iterator2, 0, sum)

2 ответа

Решение

Просто используйте лямбду.

std::thread t1([=](){reduce(iterator1, iterator2, 0, sum));

Магия!

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

template<class RandomAccessIterator, class T, class Func>
std::thread reduce_helper(RandomAccessIterator first, RandomAccessIterator last, const T& initial_value, Func func) {
    return std::thread(reduce<RandomAccessIterator, T, Func>, first, last, initial_value, func);
}

тогда используйте это как:

std::thread t1 = reduce_helper(iterator1, iterator2, 0, sum);
Другие вопросы по тегам