2012-11-06 27 views
1

我正在学习用于查找数组中元素数量的技巧(以便我可以开始编写排序算法,而不需要将数组的长度作为数组传递参数),但在本教程中,这条线显示为模板声明:具有多个类型名称的C++模板

template <typename T, size_t N> 

老实说,我不知道,你可以在一个模板声明声明多个typenames,但还什么“为size_t N”呢?这是模板声明中的变量声明吗?

+0

No size_t表示您正在使用size_t类型的整数值创建模板,如果您使用编译时数组(通常为小N),这可以帮助您。 您必须明白'typename T'意思是T是模板中泛型类型的占位符。 – linello

+0

size_t是一种无符号类型,用于包含某种类型的大小,例如以字节数或字符数表示的缓冲区大小。 –

+1

请注意['std :: array'](http://en.cppreference.com/w/cpp/container/array)和['std :: extent'](http://en.cppreference.com/瓦特/ CPP /类型/程度)。这些可能会帮助你以及数组中元素的数量。 – dyp

回答

6

size_t是类似于unsigned int的类型。把它放在模板参数中意味着你通过了一个size_t,而不是一个类型。 N可能代表数组的大小,它是一个无符号值。例如:

template<typename T, size_t N> 
void zeroArray(T (&arr)[N]) { //arr is a reference to an array 
    std::fill(arr, arr + N, 0); //of N elements of type T 
} 

int main() { 
    int arr[3]; 
    zeroArray<int, 3>(arr); 
} 

在这个例子中,我可能会说:

zeroArray(arr); 

因为这两个模板参数推导。

+0

很好的解释,谢谢 – imkendal

+0

注意:如果使用C++ 11,'std :: begin'和'std :: end'可以用于数组,所以你可以使用那些而不是'arr'和'arr + N '。你也可以自己制作C++ 03。 – chris

+0

我使用fedora作为我笔记本电脑上的主要操作系统,我老实说完全不知道我使用的是什么版本的C++(我会在发布之后通过谷歌来检查它),但我确实有一个问题。我经常安装所有可用的更新,是否为大多数Linux系统更新了C++库? – imkendal

1

“size_t N”做什么?这是模板声明中的变量声明吗?

是的,基本上。

模板参数可能是整数类型的类型或值。还有一些其他的东西,他们就可以了,太(见[C++11: 14.3.2/1]),我不会把它们称为“变量” 本身,但是......

反正值可以推断一样的类型,太,因此:

template <typename T, size_t N> 
size_t array_size(const T (&)[N]) 
{ 
    return N; 
} 

int main() 
{ 
    int x[5]; 
    char y[10]; 
    std::string z[20]; 

    std::cout << array_size(x) << ',' << array_size(y) << ',' << array_size(z) << '\n'; 
} 

输出:5,10,20

完美有效。

+0

我不会称之为变量(prvalue)。还有更多类型可以使用(我想你知道这一点,仅供参考)。 – dyp

+0

@DyP:谁叫它变量?是的,它们被列在'[C++ 11:14.3.2/1]'中。仅供参考。 –

+0

该OP,它可能看起来像你同意(“这是一个变量声明”)。 – dyp