template<typename ...Args>
是一個可變模板。這意味着,您可以指定任意數量的模板類型參數,但我認爲您已經知道這一點。
每當Args...
出現在模板代碼,這將是解壓(「擴展」)的類型實例化的。在你的例子中,這是int, bool
。所以,你的類成爲,當完全展開,這樣的定義:
struct A<int, bool>
{
template <int, bool>
void f() {}
};
這意味着,A<int,bool>::f()
再次模板(參數拆包到另一個模板聲明,你叫吧),但這次非型同類型int
和bool
模板參數(他們是匿名的),所以你可以例如像這樣的實例f()
:
a.f<1, true>();
不幸的是,g++
似乎有一個錯誤,並且won't accept這段代碼,而它accepts你的代碼。
clang
接受這兩個代碼。我希望在你的代碼中,clang不在乎int
和bool
模板參數是否被忽略,但是它們在指定時不會抱怨(與g++
相反)。
用例:
如果你要使用指定的值,就不能匿名(顯然)。你可以,例如,在f()
這是用來「printf的」模板值提供格式字符串,像這樣:
template <Args ...values>
void f(const char *fmt) {
std::printf(fmt, values...);
}
接着,下面的代碼
A<int> a;
a.f<42>("The answer is %d!\n");
會打印:
The answer is 42!
但是,使用上述語法(Args...
擴展爲匿名非類型模板參數),模板參數本質上是無用。
沒有指定值,它仍然編譯(這讓我感到驚訝!)並打印未初始化的值int
值。
這意味着它擴展到'template'因爲這是您在實例化類時做出的Args。但我不完全確定它是如何編譯的,因爲實際上將它改爲'template '並不是。 –
chris
我認爲這是一個編譯器錯誤 –
...它應該像這樣使用,但它不能:http://ideone.com/gAQEox(注意:使用'template'擴展爲'template ' ,這很好:http://ideone.com/Q70BzL) –
leemes