2013-05-20 85 views
1

在我研究的模板中,我們只能有整型參數,即int,指向其他數據類型的指針以及模板模板參數。在C++中的模板中將類作爲非類型參數傳遞

但是在這裏我只能傳遞一個簡單的類作爲模板參數。這是有效的還是我所理解的是錯誤的。這是一段代碼。

template <typename T> 
class A { 
    public: 
     T t;    
}; 
class B { 
    public: 
     float f;  
}; 
template <template<typename> class X, class H> 
class C { 
    public: 
      H obj; 
      X<int> x;         
}; 
int main() 
{ 
    C < A, B > my; 
    my.obj.f = 2.3f; 
    my.x.t = 5; 
    cout << "template class object: " << my.obj.f << endl; 
    cout << "class object   : " << my.x.t << endl; 
} 

回答

2

有三種類型的模板參數:

  • 類型參數,其中類型具有作爲參數(例如intstd::string等)被提供。在你的例子中,H是一個類型參數;
  • 非類型參數,必須提供作爲參數(例如42)。你的例子不包含任何這些;
  • 模板參數必須提供一個類模板(接受正確數量和類型的參數)。在你的例子中,A是一個模板參數。

在模板作爲我的研究,我們只能有不可分割的論點即INT,指向其他數據類型也模板的模板參數。

你在上述句子的第一部分提到的內容適用於第二類參數,即非類型參數,而句子的最後部分涵蓋了模板模板參數。

事實上,非類型參數需要特定類型的值,例如, int,到作爲參數實例化模板時被傳遞,並有嚴重的制約:

  • 可指定類型;
  • 可指定值的性質。

例如,這是被禁止的:

template<double D> 
struct X { /* ... */ }; 

雖然這是允許的:

template<int* P> 
struct X { /* ... */ }; 

但約束被放置在什麼可以作爲論據P提供:

int main() 
{ 
    int x = 42; 
    X<&x> obj; // ERROR! 
} 

你的部分上面的句子不包含的是第一類(類型參數),而這實際上是最常見的類型。除其他事項外,類型參數被用於實例化對象的通用集合,如:

std::vector<my_class> v; 
+0

雙(或浮動)甚至在C++ 11作爲非類型模板參數不允許? –

+0

@Koushik:不,不是 –

+0

除歷史之外,還有什麼理由嗎? –

相關問題