2012-07-26 46 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的模板数组长度参数。