《c++ templates》學習筆記(3)——第四章,非類型模板參數

來源:互聯網
上載者:User
 

1       第四章 非類型模板參數

對於函數模板和類模板,模板參數並不局限於類型,普通值也可以作為模板參數。

1.1    非類型的類模板參數

例如:

Template<typename T, int MAXSIZE>

Class Stack{

Private:

       T elems[MAXSIZE];

};

 

Int main()

{

       Stack<int, 20> int20Stack;

       Stack<int, 40> int40Stack;

};

每個模板執行個體都具有自己的類型,因此int20Stack和int40Stack屬於不同的類型,而且這兩種類型之間也不存在顯示或者隱式的類型轉換;所以他們之間不能相互替換。

 

1.2    非類型的函數模板參數

template<typename T, int VAL>

T addValue(T const& x)

{

     return x+VAL;

}

std::vector<int> src;

     std::vector<int> dest;

     src.push_back(1);

     src.push_back(2);

     dest.resize(5);

     std::transform(src.begin(), src.end(), dest.begin(), addValue<int, 5>);//1

書上說最後一句要寫成:

     std::transform(src.begin(), src.end(), dest.begin(), (int(*)(int const&))addValue<int, 5>);//2

經過我在VS2005下驗證,直接寫成1的樣式就可以了。

1.3    非類型模板參數的限制

一般來說,非類型模板參數可以是常整數(包括枚舉)或者指向外部連結化物件的指標。

那麼就是說,浮點數是不行的,指向內部連結化物件的指標是不行的。

那麼,什麼是指向內部連結化物件的指標呢,下面給一個例子。

 

template<char const* name>

class MyClass{

     ...

};

 

MyClass<"hello"> x;

其中的”hello”就是一個內部連結化物件,因為他是一個字面常量。字面常量都是內部連結化物件。

 

如果改為:

extern char const s[] = "hello";

MyClass<s> x;

則是可以的。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.