che*_*eng 8 c++ arrays templates
我对C++如何实例化模板感到困惑.我有一段代码:
template <class T, int arraySize>
void test1(T (&array)[arraySize])
{
cout << typeid(T).name() << endl;
}
template<class T>
void test2(T &array)
{
cout << typeid(T).name() << endl;
}
int main()
{
int abc[5];
test1(abc);
test2(abc);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
以下是我的问题:
1.如何将数组abc的大小传递给test1(参数arraySize)?
2. C++编译器如何确定两个模板中的T类型?
arraySize和T从类型推断出array的参数.既然你传递一个int[5],arraySize并T成为5与int分别在编译时.例如,如果您声明int* abc = new int[5];,您的编译器会在您尝试调用的位置进行barf test1(abc).除了基本的类型不匹配之外,int*没有足够的信息来推断数组的大小.
它被称为模板参数推导.
该类型的abc在调用点是:int(&)[5]它有两个信息结合:int和5.而函数模板接受类型的参数T(&)[N],但是在调用点的说法是,int(&)[5],所以编译器推断出T是int和N是5.
阅读这些:
在 test1 中,编译器创建一个模板,其形式为 T[arraySize]。当您调用 test1(abc) 时,您将提供一个类型为 int[5] 的输入参数,模板匹配器会自动匹配该参数。
但是,如果你要写
int n=10;
int *abc = new int[n];
test1(abc);
test1<int,n>(abc);
Run Code Online (Sandbox Code Playgroud)
那么编译将会失败,并且编译器会声称它没有与 test1(abc) 函数调用或 test1< int,n >(abc) 函数调用相匹配的模板。
这是因为 abc 的大小现在是动态分配的,因此 abc 的类型是一个具有不同类型的指针,因此没有模板可以与上述两个调用匹配。
下面的代码展示了一些类型
#include <iostream>
using namespace std;
template <class T> void printName() {cout<<typeid(T).name()<<endl;}
int main()
{
printName<int[2]>(); //type = A2_i
printName<int*>(); //type = Pi
getchar();
return 0;
}
Run Code Online (Sandbox Code Playgroud)