3

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

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) 
+3

возможно ['declytype'] (http://en.cppreference.com/w/cpp/language/decltype)? – user463035818

+1

btw «Я не могу начать thread by:» thats, потому что 'reduce' не является функцией, это просто шаблон – user463035818

+0

, где вы называете' std :: thread t1 (...) ', если это не внутри шаблона , запись 'declytype (someObject)' не намного короче, чем просто набирать 'typeOfObject'. С другой стороны, если он находится внутри шаблона, то, возможно, вы уже знаете типы – user463035818

ответ

4

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

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

Magic!

6

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

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);