簡體   English   中英

在C ++中的模板中將類作為非類型參數傳遞

[英]Passing Class as a Non-type argument in templates in c++

在我研究的模板中,我們只能有整數參數,即int,指向其他數據類型的指針以及模板模板參數。

但是在這里,我也可以只傳遞一個簡單的類作為模板參數。 這是有效的還是我的理解是錯誤的。 這是一段代碼。

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;
}

模板參數有三種類型:

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

在我研究的模板中,我們只能有整數參數,即int,指向其他數據類型的指針以及模板模板參數。

您在以上句子的第一部分中所指的內容適用於第二類參數,即非類型參數,而句子的最后部分涵蓋模板模板參數。

實際上,非類型參數要求在實例化模板時將特定類型的值(例如intX*作為參數傳遞,並且存在以下嚴格約束:

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

例如,這是禁止的:

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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM