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

时间:2018-01-21 20:12:43

标签: c++

请考虑我从another of my questions获得的代码:

#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版本;与普通参考版本相同。

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

1 个答案:

答案 0 :(得分:0)

好的,没有人想发一个答案,所以我会回答这个问题。如上面的注释中所述,编译器将通过模板参数推导推导出参数Args的类型;没有必要明确声明所有模板参数。