Skip to content

泛型函数

泛型参数

我们之前说了编译确定量的概念。在mcfpp中,可以声明一个函数需要一些编译确定量作为参数。需要使用<>来包围编译确定量的参数列表,从而和普通的参数区分开。在调用的时候,也要使用<>来包围编译确定量的参数。

mcfpp

func test<int i>{
    print(i);
}

func main(){
    test<5>;
    test<6>;
}

在上面的例子中,test函数接受一个编译确定量i作为参数,然后打印出这个参数。在main函数中,我们调用了两次test函数,分别传递了56作为参数。这样,test函数就会打印出56

值得注意的是,编译器会在编译的时候,不会立刻将test函数编译,而是会等到要调用的时候,再将test函数的代码进行编译,并分别替换i56。这样,test函数就会有两个版本,分别打印出56。而在编译好的数据包中,也只会包含编译后的test函数,不会包含原来的test函数。

类型参数

有一种特殊的变量,叫做类型变量。类型变量永远只能是编译时确定量,因此永远是编译器已知的。如果尝试让编译器丢失对类型变量的追踪,那么编译器会报错。

使用type关键字对类型变量进行声明。例如:

mcfpp
type t = int;

此时,t就代表了int变量。但是这个时候,你还不能将t直接用于t qwq = 1这种变量声明,因为t并没有被注册入编译器的类型缓存中。只有当编译器作为函数的泛型参数被传入时,你才可以在这个函数中,使用这个类型变量进行变量声明。

mcfpp
func test<type T>(T i){
    print(qwq);
}

func main(){
    type t = int;
    test<t>(1);
}