2012-07-26 44 views
3

我是新的C++模板的語法和遇到的這些C++模板相關的代碼,但不能夠明白自己的意思:需要幫助理解這個C++模板

class StringBuffer 
{ 
    CharBuffer cb; 
.. 
    template <size_t ArrayLength> 
    bool append(const char (&array)[ArrayLength]) { 
     return cb.append(array, array + ArrayLength - 1); /* No trailing '\0'. */ 
    } 
}; 

什麼的布爾追加(爲const char (& array)[ArrayLength])是什麼意思?在我看來,函數模板將被實例化爲帶有特定ArrayLength的參數。但是,不是我們不能在函數的參數列表中指定數組長度嗎? const char(& array)是什麼意思?不應該像const char &(沒有括號)?

我正在看書C++模板David Vandevoorde/Nicolai M.Josuttis的完整指南,本書的哪一部分涵蓋了上述語法?

回答

2
const char (&array)[ArrayLength] 

char類型的ArrayLength對象的數組的引用。

沒有括號,它將是一個引用數組,這是不允許的。如果沒有&,它將是一個數組(它作爲函數參數)衰減到指針,失去有關數組大小的信息。

在我看來,功能模板將被實例化爲某個參數與特定的ArrayLength。

沒錯。數組長度在編譯時是已知的,並且這將實例化一個可以使用該編譯時值的函數。

但是,是不是我們不能在函數的參數列表中指定數組長度?

是的,你可以提供一個額外的功能參數的長度;但那將是一個運行時間值,並且會有一些方法來驗證它是正確的。模板確保模板參數確實是數組的大小。

本書的哪一部分涵蓋了上述語法?

我沒有這本書,但是,看着table of contents我建議看4.2(無類型函數模板參數)和11(模板參數推導)對這種事情。

4

它的意思是「引用const char數組」。 它的原因是,如果你傳似

template <int S> 
void f(T a[s]){} 

您將根據「陣列參數折舊規則」失去的大小的信息,主要是因爲指針不持有數組大小的信息。 (AKA標準如此說。) 所以你必須通過引用而不是通過指針值傳遞。

[]前是爲了使&優先它需要像

T (&a)[s] 
2

完成它的語法傳遞數組必需的,因爲[]將優先考慮在&前面,所以括號通過引用(因爲數組不能由值用C++傳遞):

void foo(const char (&array)[10]) { ... } // We can pass an array of lenth 10 

立即扔模板參數在混合,而不是10的編譯器知道數組的在編譯時的尺寸並且可以實例化溫度遲到和正確的價值。

template<size_t N> 
void foo(const char (&array)[N]) 
{ 
    // use N, it'll be whatever the size of the array you instantiate the template with is 
} 
0

給定的代碼是一個很好的教訓: 首先,它要傳遞一個陣列,所以不能按值傳遞,然後由refrence(&)通過,然後由常量字傳遞給它安全地通過它。 你知道C/C++在數組中有限制,所以這段代碼的程序員爲Array的長度定義了一個模板,並解決了這個問題。

0

該語法將根據靜態分配的數組參數的大小設置模板參數。

「append」(包含的)的模板版本調用了一個重載,它接受2個參數:指向char和count的指針(您沒有包含這個)。

所以,你可能有這樣一個數組:

const char my_string[] = "hi"; 

你會使用這樣的「追加」的成員函數:

my_string_buffer_object.append(my_string); 

而且my_string會自動檢測的長度,設置將ArrayLength參數設置爲my_string的長度。然後調用一個更詳細的「append」版本,併爲您自動填充字符串長度。

基本上,這個版本的「accept」包裝了另一個版本。它可以讓你傳遞一個數組作爲唯一的參數,使用模板參數的信息自動填充一個長度。

如果使用此語法,請記住這些數組長度參數會計算元素數量而不是對象大小(sizeof會告訴您有關數組的大小)。對於char,這些是相同的,但具有大尺寸元素類型的數組將產生小於其sizeof的模板數組長度參數。