构造函数模板

时间:2019-05-22 09:21:09

标签: c++ c++11

我看到一个类的构造函数很奇怪:

class HashTable
{
public:
    template <int N>
    HashTable(const char(&str)[N])

    {
    }
};

能否请您解释一下和一些示例,或者给我一个相关链接? 我真的不明白const char(&str)[N]

1 个答案:

答案 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 ++方式是使用barstd::vector,除非被证明是瓶颈。