2012-11-28 51 views
0

我一直在認真研究C++中的模板,我發現它似乎有挑戰性,似乎沒有一套嚴格的術語來明確識別和區分/消除每個語法元素可以使用模板出現。C++中與模板相關的語法元素的名稱分類

例如,Josuttis和Vandevoorde關於模板的經常參考的書()是一本傑出的書,但即使是那本書也沒有清楚地確定每個涉及模板的句法元素的嚴謹術語。相反,從上下文來看意義是清楚的。

請考慮下面這個簡單的例子,我相信它會突出顯示涉及模板的11個不同的相關語法組件。

#include <iostream> 
#include <vector> 

template 
    < 
     typename 

      M1, // <-- (1) "Primary template declaration template parameter 
       //   identifier" 

     typename M2 // ditto 

    > // <-- (2) (entire <...> syntactic element) "Primary template declaration 
     //           template parameter list" 

class Foo 
{ 

    // <-- (3) "Primary class template definition" 

}; 

template 
    < 
     typename 

      T1, // <-- (4) "Template specialization declaration template 
       //   parameter identifier" 

     typename A1, typename M2 // ditto 

    > // <-- (5) (entire <...> syntactic element) "Template specialization 
     //           declaration template 
     //           parameter list" 

class Foo 
    < 

     std::vector<T1, A1> &, // <-- (6) "Template specialization 
           //   declaration TEMPLATE PARAMETER 
           //   SPECIALIZATION ARGUMENT" 
           //   (?) 

     M2 

    > // <-- (7) (entire <> syntactic element) "Template specialization 
     //          declaration TEMPLATE PARAMETER 
     //          SPECIALIZATION ARGUMENT LIST" 
     //          (?) 

{ 

    // <-- (8) "Template specialization class definition" 

}; 

int main() 
{ 
    Foo 
     < 

      std::vector<int> &, // <-- (9) "Template class instantiation 
           //   template parameter" 
           //   (?) 

      int // diito 

     > // <-- (10) (entire <> syntactic element) "Template class 
      //           instantiation template 
      //           parameter list" 
      //           (?) 

    f; // <-- (11) "Template class instantiation instance variable name" 

} 

在代碼示例中,我已經指出了11個不同的與模板相關的語法元素,並提供了我對每個元素建議的嚴格分類標籤。

我懷疑我對這些元素中的大多數使用了正確的分類標識符(但如果我錯了,請糾正我)。 (6),(7),(9)和(10)是棘手的 - 例如,在(6)和(7)的情況下,存在模板專業化的情況,在該對角撐架<>的出現兩次,所以必須有在用於指示所述角括號內爲這兩種截然不同的對角撐架之間出現的參數(參數?)的標識符的分類學區分。模板實例(9)和(10)還包括另一使用尖括號的,所以那些括號內出現的參數必須有自己的識別分類標識符,以及。

也許,在這個問題上,我已經使用了適當的嚴謹的術語,但我想知道:

  1. 有沒有更簡單的嚴謹的術語比我用什麼呢?

  2. 我是否在識別標籤中使用了無關和/或不必要的字詞?

  3. 是否有丟失我的識別標籤中的單詞?

  4. 我正確的識別標籤我用過嗎?

+0

您的仔細研究是否包含C++標準的相關章節(14)?這足夠嚴格地定義語法來編寫編譯器;你認爲缺少什麼? –

+0

沒有好想法。我去做。如果有人有時間在這裏總結和發佈相關的語法標識符,那將回答我的問題並協助努力研究標準。 –

+1

語法概要在附錄A.12中,但我沒有權限在此處發佈。 –

回答

1

我不認爲你需要如此重視模板參數,他們在任何地方都扮演相同的角色。一些非常重要的術語,其中沒有提及的部分:

template<typename T> struct foo;是主模板的聲明。
template<typename T> struct foo<T*>;是部分專業化的聲明。
template<> struct foo<int>;是顯式專業化的聲明。

當遇到類似於變量定義foo<double> f;的情況時,相應專業化的實例化爲有時需要。特別是如果聲明瞭明確的專業化,則不需要。通俗地說,隱式實例化的過程就是下面的重寫:

template<typename T> struct foo { 
    void bar(); 
}; 
template<typename T> void foo<T>::bar() {} 

這樣:

template<typename T> struct foo; 

template<> struct foo<double> { 
    void bar(); 
}; 
template<> void foo<double>::bar() {} 

它也可以要求在任何給定恩,一個實例被稱爲一個明確的實例:

// explicit instantiation declaration, C++11 
extern template class foo<double>; 
// explicit instantiation definition 
template class foo<double>; 

// can also instantiate a member of the template more specifically: 
template void foo<double>::bar(); 

,顧名思義,顯式實例定義的方式,以保證模板(如果適用,其所有成員)是instanti ated。顯式實例化聲明是相反的位 - 它們會抑制隱式實例化,而是使用由匹配的顯式實例化定義生成的實例化。顯式實例化特徵的總體意圖是爲程序提供「引導」編譯器爲例如幫助編譯時間。

我不會爲實現明確的實例化的質量評價 - 其實,讓需要注意的是顯式實例報關單是最近才加入。我認爲你可以花費大量的時間用C++而不會遇到或者需要任何一個特性。

或許令人混淆,很多人實際上將非正式地使用術語「模板實例化」而不是「模板特殊化」。爲了澄清,以下是所有模板專門:std::deque<int>std::less<T*>std::vector<bool>(儘管當然不是同一類模板的!)。並非所有使用或提到模板專門化都會觸發或引用模板實例。事實上,無需知道何時或是否觸發了模板實例化,我認爲這是模板的一個方便功能。

其實也有一些被稱爲實例化點:

// Declare template 
template<typename T> struct foo; 

// Use template and mention template specialization 
// but no instantiation is required here! 
typedef foo<int> F; 

// Point of instantiation of foo<int> 
// an actual definition of foo<int> is needed here 
F f; 

(雖然我只用這裏的類模板,所有的東西我描述適用於模板整體,包括函數模板)

+0

非常好的答案 - 謝謝。一個切線的(希望短暫的)後續行動,而我沒有(我認爲)完全理解你答案的唯一部分:你在答案的頂部提到了部分專業化。關於偏特:被'模板 C類<性病::矢量> {}'的局部或完整,'模板 C類{}'的專業化? –

+1

@DanNissenbaum:如果你有'template <>',你只需要明確的專業化。只要有模板參數,就是部分專業化。 – Xeo

+0

@Xeo即使沒有專業化中的模板參數與主模板中的任何模板參數相對應,您是否可以確認這是真的? –