在c++中,我们知道,如果我们将一个数组作为形参传入函数中,同时我们又希望函数的操作可以影响到实参的数组。我们有两种办法,一种是将我们的数组定义成全局变量,一种是我们传入一个数组的引用。由于c++ 中的linker 我们往往不想让linker总是挂念着某个数组或者其他什么东西。所以我们想传入一个数组的引用。
一维数组:
template<int m> void insert((&str)[m])
{
}
二维数组:
template<int m,int n> void insert((&str)[m][n])
{
}
这样我们就传递了一个数组的引用。我们在这里使用了模板函数,他的意思是让编译器自己去计算m n的值,然后将m,n 的值带入函数中,再由编译器自己写好带入m,n 值以后的哪个具体的函数。这些都是在编译的时候就完成的,就像在编译的时候会把所有的不同形式的常量都变成具体的数字一样。这就意味着,模板函数本质上只是声明而已,只有当你去调用模板函数的时候编译器才会帮你定义好函数,并写到你的源代码里,如果你没有调用模板函数的话,那么你的模板函数就相当于什么也没写。值得一提的是MSVC编译器不会对你不使用的模板错误进行报错,但一些编译器,比如Clang会报错。对Clang相当的严格。
所以我们只需要把我们的模板函数写到头文件里就好了,我们不需要再去其他源代码中定义这部分函数,事实上就算你想这样 linker 也不会允许。
c++的模板是非常强大且疯狂的,而且没有什么局限性。这些可能连模板的冰山一角也算不上,如果有机会我会发csdn来详细讲解c++模板的,包括c++模板到底是怎样运作的,模板可以干什么,以及如何恰到好处的使用模板,而不是让你的代码变得疯狂。事实上我写过很多疯狂的模板,好吧,其实我是一个疯狂的人。我还总是偏爱于c++原始的数组 而不是std::array,虽然这样有时候很危险,但事实上我是个喜欢危险的人。