C++中的模板实例化

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类型?

Mar*_*tos 7

  1. 正常意义上没有参数传递,因为模板参数在编译时被解析.
  2. 两个arraySizeT从类型推断出array的参数.既然你传递一个int[5],arraySizeT成为5int分别在编译时.

例如,如果您声明int* abc = new int[5];,您的编译器会在您尝试调用的位置进行barf test1(abc).除了基本的类型不匹配之外,int*没有足够的信息来推断数组的大小.


Naw*_*waz 5

它被称为模板参数推导.

类型abc在调用点是:int(&)[5]它有两个信息结合:int5.而函数模板接受类型的参数T(&)[N],但是在调用点的说法是,int(&)[5],所以编译器推断出TintN5.

阅读这些:


twe*_*ter 4

在 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)