我看到一个类的构造函数很奇怪:
class HashTable
{
public:
template <int N>
HashTable(const char(&str)[N])
{
}
};
能否请您解释一下和一些示例,或者给我一个相关链接?
我真的不明白const char(&str)[N]
。
答案 0 :(得分:5)
这是一种捕获数组参数大小的方法。数组的类型为T[N]
,通常可以衰减为T*
。
#include <iostream>
template <int N>
void foo(const char(&str)[N]){
for(int i=0;i<N;++i)
std::cout<<str<<' ';
}
void foo(const char* str){
//for(int i=0;i<??;++i)
}
void bar(const char* str, int n){
for(int i=0;i<n;++i)
std::cout<<str<<' ';
}
int main(){
const char str[] = "Hello";//type is const char[6]
const char* str2 = str; //Decay
// const char str3[] = str; (6)
int n = sizeof(str)/sizeof(str[0]);
foo(str);// (1) Calls foo<6>
foo(str2);// (2) Must call foo(const char*) which is useless
bar(str, n); // (3) Array can decay
bar(str2, n); // (4) Same as (3) - bar can be used with all arrays
bar(str2, 10); // (5) Buffer overrun
}
以上示例显示了模板化方法的用法和局限性。优点是您不必分别传递大小,因此它总是正确的。最大的缺点是衰减过程是不可逆的,因此该函数将变得无用-(2)无法调用模板。
模板很方便,但是大多数数组通过bar
将指针传递给指针,从而很快分解为指针-这是C语言中的唯一方法-或者仅仅是因为在编译时不知道指针的大小-{{1} }。另一个问题是C和C ++(6)均无效-没有隐式方法可以复制数组。因此malloc, new
方法更为常见,但需要格外小心以传递正确的大小。正确的c ++方式是使用bar
或std::vector
,除非被证明是瓶颈。