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

我不能啓動線程:未創建由於template行爲

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

因爲reduce功能。 我必須手動編寫在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「我無法啓動線程:」因爲'reduce'不是一個函數,它只是一個模板 – user463035818

+0

如果模板不在模板內部,你會在哪裏調用'std :: thread t1(...)' ,編寫'declytype(someObject)'並不比輸入'typeOfObject'短得多。另一方面,如果它在模板內部,那麼你可能已經知道類型 – user463035818

回答

4

只需使用lambda。

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

魔法!

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