国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

C++箴言:理解typename兩個(gè)含義

2019-11-17 05:09:06
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

  在下面的 template declarations(模板聲明)中 class 和 typename 有什么不同?

  template class Widget; // uses "class"
  template class Widget; // uses "typename"

  答案:沒什么不同。在聲明一個(gè) template type parameter(模板類型參數(shù))的時(shí)候,class 和 typename 意味著完全相同的東西。一些程序員更喜歡在所有的時(shí)間都用 class,因?yàn)樗p易輸入。其他人(包括我本人)更喜歡 typename,因?yàn)樗凳局@個(gè)參數(shù)不必要是一個(gè) class type(類類型)。少數(shù)開發(fā)者在任何類型都被答應(yīng)的時(shí)候使用 typename,而把 class 保留給僅接受 user-defined types(用戶定義類型)的場(chǎng)合。但是從 C++ 的觀點(diǎn)看,class 和 typename 在聲明一個(gè) template parameter(模板參數(shù))時(shí)意味著完全相同的東西。

  然而,C++ 并不總是把 class 和 typename 視為等同的東西。有時(shí)你必須使用 typename。為了理解這一點(diǎn),我們不得不討論你會(huì)在一個(gè) template(模板)中涉及到的兩種名字。

  假設(shè)我們有一個(gè)函數(shù)的模板,它能取得一個(gè) STL-compatible container(STL 兼容容器)中持有的能賦值給 ints 的對(duì)象。進(jìn)一步假設(shè)這個(gè)函數(shù)只是簡(jiǎn)單地打印它的第二個(gè)元素的值。它是一個(gè)用糊涂的方法實(shí)現(xiàn)的糊涂的函數(shù),而且就像我下面寫的,它甚至不能編譯,但是請(qǐng)將這些事先放在一邊——有一種方法能發(fā)現(xiàn)我的愚蠢:

  template // PRint 2nd element in
  void print2nd(const C& container) // container;
  {
  // this is not valid C++!
  if (container.size() >= 2) {
  C::const_iterator iter(container.begin()); // get iterator to 1st element
  ++iter; // move iter to 2nd element
  int value = *iter; // copy that element to an int
  std::cout << value; // print the int
  }
  }

  我突出了這個(gè)函數(shù)中的兩個(gè) local variables(局部變量),iter 和 value。iter 的類型是 C::const_iterator,一個(gè)依靠于 template parameter(模板參數(shù))C 的類型。一個(gè) template(模板)中的依靠于一個(gè) template parameter(模板參數(shù))的名字被稱為 dependent names(依靠名字)。當(dāng)一個(gè) dependent names(依靠名字)嵌套在一個(gè) class(類)的內(nèi)部時(shí),我稱它為 nested dependent name(嵌套依靠名字)。C::const_iterator 是一個(gè) nested dependent name(嵌套依靠名字)。實(shí)際上,它是一個(gè) nested dependent type name(嵌套依靠類型名),也就是說(shuō),一個(gè)涉及到一個(gè) type(類型)的 nested dependent name(嵌套依靠名字)。

  print2nd 中的另一個(gè) local variable(局部變量)value 具有 int 類型。int 是一個(gè)不依靠于任何 template parameter(模板參數(shù))的名字。這樣的名字以 non-dependent names(非依靠名字)聞名。(我想不通為什么他們不稱它為 independent names(無(wú)依靠名字)。假如,像我一樣,你發(fā)現(xiàn)術(shù)語(yǔ) "non-dependent" 是一個(gè)令人厭惡的東西,你就和我產(chǎn)生了共鳴,但是 "non-dependent" 就是這類名字的術(shù)語(yǔ),所以,像我一樣,轉(zhuǎn)轉(zhuǎn)眼睛放棄你的自我主張。)

  nested dependent name(嵌套依靠名字)會(huì)導(dǎo)致解析困難。例如,假設(shè)我們更加愚蠢地以這種方法開始 print2nd:

  template
  void print2nd(const C& container)
  {
  C::const_iterator * x;
  ...
  }

  這看上去似乎是我們將 x 聲明為一個(gè)指向 C::const_iterator 的 local variable(局部變量)。但是它看上去如此僅僅是因?yàn)槲覀冎?C::const_iterator 是一個(gè) type(類型)。但是假如 C::const_iterator 不是一個(gè) type(類型)呢?假如 C 有一個(gè) static data member(靜態(tài)數(shù)據(jù)成員)碰巧就叫做 const_iterator 呢?再假如 x 碰巧是一個(gè) global variable(全局變量)的名字呢?在這種情況下,上面的代碼就不是聲明一個(gè) local variable(局部變量),而是成為 C::const_iterator 乘以 x!當(dāng)然,這聽起來(lái)有些愚蠢,但它是可能的,而編寫 C++ 解析器的人必須考慮所有可能的輸入,甚至是愚蠢的。

  在下面的 template declarations(模板聲明)中 class 和 typename 有什么不同?

  template class Widget; // uses "class"
  template class Widget; // uses "typename"

  答案:沒什么不同。在聲明一個(gè) template type parameter(模板類型參數(shù))的時(shí)候,class 和 typename 意味著完全相同的東西。一些程序員更喜歡在所有的時(shí)間都用 class,因?yàn)樗p易輸入。其他人(包括我本人)更喜歡 typename,因?yàn)樗凳局@個(gè)參數(shù)不必要是一個(gè) class type(類類型)。少數(shù)開發(fā)者在任何類型都被答應(yīng)的時(shí)候使用 typename,而把 class 保留給僅接受 user-defined types(用戶定義類型)的場(chǎng)合。但是從 C++ 的觀點(diǎn)看,class 和 typename 在聲明一個(gè) template parameter(模板參數(shù))時(shí)意味著完全相同的東西。

  然而,C++ 并不總是把 class 和 typename 視為等同的東西。有時(shí)你必須使用 typename。為了理解這一點(diǎn),我們不得不討論你會(huì)在一個(gè) template(模板)中涉及到的兩種名字。
  假設(shè)我們有一個(gè)函數(shù)的模板,它能取得一個(gè) STL-compatible container(STL 兼容容器)中持有的能賦值給 ints 的對(duì)象。進(jìn)一步假設(shè)這個(gè)函數(shù)只是簡(jiǎn)單地打印它的第二個(gè)元素的值。
它是一個(gè)用糊涂的方法實(shí)現(xiàn)的糊涂的函數(shù),而且就像我下面寫的,它甚至不能編譯,但是請(qǐng)將這些事先放在一邊——有一種方法能發(fā)現(xiàn)我的愚蠢:

  template // print 2nd element in
  void print2nd(const C& container) // container;
  {
  // this is not valid C++!
  if (container.size() >= 2) {
  C::const_iterator iter(container.begin()); // get iterator to 1st element
  ++iter; // move iter to 2nd element
  int value = *iter; // copy that element to an int
  std::cout << value; // print the int
  }
  }

  我突出了這個(gè)函數(shù)中的兩個(gè) local variables(局部變量),iter 和 value。iter 的類型是 C::const_iterator,一個(gè)依靠于 template parameter(模板參數(shù))C 的類型。一個(gè) template(模板)中的依靠于一個(gè) template parameter(模板參數(shù))的名字被稱為 dependent names(依靠名字)。當(dāng)一個(gè) dependent names(依靠名字)嵌套在一個(gè) class(類)的內(nèi)部時(shí),我稱它為 nested dependent name(嵌套依靠名字)。C::const_iterator 是一個(gè) nested dependent name(嵌套依靠名字)。實(shí)際上,它是一個(gè) nested dependent type name(嵌套依靠類型名),也就是說(shuō),一個(gè)涉及到一個(gè) type(類型)的 nested dependent name(嵌套依靠名字)。

  print2nd 中的另一個(gè) local variable(局部變量)value 具有 int 類型。int 是一個(gè)不依靠于任何 template parameter(模板參數(shù))的名字。這樣的名字以 non-dependent names(非依靠名字)聞名。(我想不通為什么他們不稱它為 independent names(無(wú)依靠名字)。假如,像我一樣,你發(fā)現(xiàn)術(shù)語(yǔ) "non-dependent" 是一個(gè)令人厭惡的東西,你就和我產(chǎn)生了共鳴,但是 "non-dependent" 就是這類名字的術(shù)語(yǔ),所以,像我一樣,轉(zhuǎn)轉(zhuǎn)眼睛放棄你的自我主張。)

  nested dependent name(嵌套依靠名字)會(huì)導(dǎo)致解析困難。例如,假設(shè)我們更加愚蠢地以這種方法開始 print2nd:

  template
  void print2nd(const C& container)
  {
  C::const_iterator * x;
  ...
  }

  這看上去似乎是我們將 x 聲明為一個(gè)指向 C::const_iterator 的 local variable(局部變量)。但是它看上去如此僅僅是因?yàn)槲覀冎?C::const_iterator 是一個(gè) type(類型)。但是假如 C::const_iterator 不是一個(gè) type(類型)呢?假如 C 有一個(gè) static data member(靜態(tài)數(shù)據(jù)成員)碰巧就叫做 const_iterator 呢?再假如 x 碰巧是一個(gè) global variable(全局變量)的名字呢?在這種情況下,上面的代碼就不是聲明一個(gè) local variable(局部變量),而是成為 C::const_iterator 乘以 x!當(dāng)然,這聽起來(lái)有些愚蠢,但它是可能的,而編寫 C++ 解析器的人必須考慮所有可能的輸入,甚至是愚蠢的。

  在下面的 template declarations(模板聲明)中 class 和 typename 有什么不同?

  template class Widget; // uses "class"
  template class Widget; // uses "typename"

  答案:沒什么不同。在聲明一個(gè) template type parameter(模板類型參數(shù))的時(shí)候,class 和 typename 意味著完全相同的東西。一些程序員更喜歡在所有的時(shí)間都用 class,因?yàn)樗p易輸入。其他人(包括我本人)更喜歡 typename,因?yàn)樗凳局@個(gè)參數(shù)不必要是一個(gè) class type(類類型)。少數(shù)開發(fā)者在任何類型都被答應(yīng)的時(shí)候使用 typename,而把 class 保留給僅接受 user-defined types(用戶定義類型)的場(chǎng)合。但是從 C++ 的觀點(diǎn)看,class 和 typename 在聲明一個(gè) template parameter(模板參數(shù))時(shí)意味著完全相同的東西。

  然而,C++ 并不總是把 class 和 typename 視為等同的東西。有時(shí)你必須使用 typename。為了理解這一點(diǎn),我們不得不討論你會(huì)在一個(gè) template(模板)中涉及到的兩種名字。

  假設(shè)我們有一個(gè)函數(shù)的模板,它能取得一個(gè) STL-compatible container(STL 兼容容器)中持有的能賦值給 ints 的對(duì)象。進(jìn)一步假設(shè)這個(gè)函數(shù)只是簡(jiǎn)單地打印它的第二個(gè)元素的值。它是一個(gè)用糊涂的方法實(shí)現(xiàn)的糊涂的函數(shù),而且就像我下面寫的,它甚至不能編譯,但是請(qǐng)將這些事先放在一邊——有一種方法能發(fā)現(xiàn)我的愚蠢:

  template // print 2nd element in
  void print2nd(const C& container) // container;
  {
  // this is not valid C++!
  if (container.size() >= 2) {
  C::const_iterator iter(container.begin()); // get iterator to 1st element
  ++iter; // move iter to 2nd element
  int value = *iter; // copy that element to an int
  std::cout << value; // print the int
  }
  }

  我突出了這個(gè)函數(shù)中的兩個(gè) local variables(局部變量),iter 和 value。
iter 的類型是 C::const_iterator,一個(gè)依靠于 template parameter(模板參數(shù))C 的類型。一個(gè) template(模板)中的依靠于一個(gè) template parameter(模板參數(shù))的名字被稱為 dependent names(依靠名字)。當(dāng)一個(gè) dependent names(依靠名字)嵌套在一個(gè) class(類)的內(nèi)部時(shí),我稱它為 nested dependent name(嵌套依靠名字)。C::const_iterator 是一個(gè) nested dependent name(嵌套依靠名字)。實(shí)際上,它是一個(gè) nested dependent type name(嵌套依靠類型名),也就是說(shuō),一個(gè)涉及到一個(gè) type(類型)的 nested dependent name(嵌套依靠名字)。

  print2nd 中的另一個(gè) local variable(局部變量)value 具有 int 類型。int 是一個(gè)不依靠于任何 template parameter(模板參數(shù))的名字。這樣的名字以 non-dependent names(非依靠名字)聞名。(我想不通為什么他們不稱它為 independent names(無(wú)依靠名字)。假如,像我一樣,你發(fā)現(xiàn)術(shù)語(yǔ) "non-dependent" 是一個(gè)令人厭惡的東西,你就和我產(chǎn)生了共鳴,但是 "non-dependent" 就是這類名字的術(shù)語(yǔ),所以,像我一樣,轉(zhuǎn)轉(zhuǎn)眼睛放棄你的自我主張。)

  nested dependent name(嵌套依靠名字)會(huì)導(dǎo)致解析困難。例如,假設(shè)我們更加愚蠢地以這種方法開始 print2nd:

  template
  void print2nd(const C& container)
  {
  C::const_iterator * x;
  ...
  }

  這看上去似乎是我們將 x 聲明為一個(gè)指向 C::const_iterator 的 local variable(局部變量)。但是它看上去如此僅僅是因?yàn)槲覀冎?C::const_iterator 是一個(gè) type(類型)。但是假如 C::const_iterator 不是一個(gè) type(類型)呢?假如 C 有一個(gè) static data member(靜態(tài)數(shù)據(jù)成員)碰巧就叫做 const_iterator 呢?再假如 x 碰巧是一個(gè) global variable(全局變量)的名字呢?在這種情況下,上面的代碼就不是聲明一個(gè) local variable(局部變量),而是成為 C::const_iterator 乘以 x!當(dāng)然,這聽起來(lái)有些愚蠢,但它是可能的,而編寫 C++ 解析器的人必須考慮所有可能的輸入,甚至是愚蠢的。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 隆昌县| 武平县| 东丰县| 大方县| 平安县| 京山县| 莱芜市| 辉县市| 旅游| 绵阳市| 宝清县| 盐山县| 莱芜市| 星子县| 桑日县| 西盟| 天津市| 拉萨市| 青海省| 勃利县| 绥芬河市| 湾仔区| 繁昌县| 怀来县| 碌曲县| 象山县| 尼玛县| 梁山县| 庄浪县| 潞城市| 乌拉特中旗| 广元市| 泗水县| 天台县| 浏阳市| 三门县| 临湘市| 眉山市| 博湖县| 新野县| 平塘县|