获取模板的类类型

Ken*_*tov 3 c++ multithreading templates type-deduction template-argument-deduction

我有这样的模板功能:

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

我无法启动线程:

std::thread t1(reduce, iterator1, iterator2, 0, sum)
Run Code Online (Sandbox Code Playgroud)

因为行为reduce不会创建功能template.我必须手动编写所有类型的定义template.喜欢:

std::thread t1(reduce<SomeIterator, SomeNumber, SomeFunc>, iterator1, iterator2, 0, sum)
Run Code Online (Sandbox Code Playgroud)

如果我有其他类型,我应该写:

std::thread t1(reduce<AnotherIterator, AnotherNumber, Func>, iterator1, iterator2, 0, sum)
Run Code Online (Sandbox Code Playgroud)

如何自动完成此过程?有没有一种方法来计算类的类型,如:

std::thread t1(reduce<typeof(X), typeof(Y), typeof(Z)>, iterator1, iterator2, 0, sum)
Run Code Online (Sandbox Code Playgroud)

son*_*yao 6

您可以编写辅助函数模板以利用模板参数推导:

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);
}
Run Code Online (Sandbox Code Playgroud)

然后用它作为:

std::thread t1 = reduce_helper(iterator1, iterator2, 0, sum);
Run Code Online (Sandbox Code Playgroud)