仅指定一个模板参数的类型

Specify type of just one template argument?

本文关键字:参数 类型 一个      更新时间:2023-10-16

请考虑我从另一个问题中获得的以下代码:

#include <thread>
using namespace std;
class CObject {};
void MyThreadFunc(CObject&) {}
void MyThreadFunc(CObject&&){}
template<typename FunctionType, typename ...Args>
void StartDetachedThread(FunctionType func, Args&&... args)
{
    thread([&]()
    {
        func(forward<Args>(args)...);
    }).detach();
}
int main()
{
    CObject object;
    StartDetachedThread<void(CObject&)>(MyThreadFunc, std::ref(object));
    CObject object2;
    StartDetachedThread<void(CObject&&)>(MyThreadFunc, std::move(object2));
    return 0;
}

StartDetachedThread的调用指定了模板参数,以便如果我将 r 值引用传递给它,它将调用需要 r 值引用的 MyThreadFunc 版本;对于普通引用版本也是如此。

很简单,当我只为一个需要两个的函数指定一个模板参数类型(我希望我的线程运行的函数的类型(时,我不明白它是如何工作的 - 有人可以澄清一下吗?

好吧,没有人愿意发布答案,所以我会回答这个问题。 如上面的注释所述,编译器将通过模板参数推导推断Args参数的类型;没有必要显式声明所有模板参数。