C++与Typescript的区别

2024-01-10 06:16:03

一、C++类模板和函数模板

在C++中,类模板和函数模板允许你为多种数据类型编写通用的代码。这就像每个人都有鼻子,耳朵,眼镜。但是有些人整合在一起就是帅哥美女,有的就长成。。。

C++主要分为两个模板-------类模板和函数模板。

1.类模板

template<class T1, class T2, class Tn>
class 类模板名
{
 // 类内成员定义
};

通常类模板是这样的格式。(typename是用来定义模板参数关键字也可以使用class。切记:不能使用struct代替class)

template <typename T>  
class AnimalHouse {  
private:  
    T size; // 房间的大小  
public:  
    AnimalHouse(T size) : size(size) {} // 构造函数,用来设置房间的大小  
    void displaySize() {  
        std::cout << "房间的大小是:" << size << std::endl;  
    }  
};
//这样使用
int main
{
AnimalHouse<int> elephantHouse(100); // 创建一个大房间给大象住,大小为100  
elephantHouse.displaySize(); // 显示这个大房间的大小  
  
AnimalHouse<int> rabbitHouse(50); // 创建一个小房间给兔子住,大小为50  
rabbitHouse.displaySize(); // 显示这个兔子的小房间的大小
}

?在这个例子中,AnimalHouse?是一个类模板,它接受一个类型参数?T。这个T可以是任何数据类型,比如int、float或者自定义的数据类型。通过使用类型参数?T,你可以创建不同大小的房间。

2.函数模板

template<typename T1, typename T2,......,typename Tn>
返回值 函数名(参数列表)
{

}

typename是用来定义模板参数关键字也可以使用class。切记:不能使用struct代替class。

template <typename T>  
T magicBox(T a, T b, bool operation)
 {  
    if (operation) 
    {  
        return a + b; // 如果选择加法,就返回两个数的和  
    }
 else
    {  
        return a - b; // 如果选择减法,就返回第一个数减去第二个数的结果  
    }  
}


int main()
{
int a=5;
int b=3;
std::cout<<magicBox<int>(a,b,true)<<std::endl; // 计算5 + 3 = 8并输出结果
std::cout<<magicBox<int>(a,b,false)<<std::endl;// 计算5 - 3 = 2并输出结果
}

?在这个例子中,magicBox?是一个函数模板,它接受两个类型参数?T?和一个布尔值?operation。类型参数?T?可以是任何数据类型,比如int、float或者自定义的数据类型。布尔值?operation?用来决定是做加法还是减法。

类模板函数模板
定义方式使用template关键字后跟类型参数与类模板相同
适用场景适用于需要创建不同数据类型的对象,并使用相同逻辑处理的场景适用于需要编写处理不同数据类型的通用函数的场景
代码复用通过创建模板类的实例来复用代码通过函数模板来复用代码
实例化次数类模板的实例化次数与其对象实例的创建次数一致函数模板的实例化次数与其函数的调用次数一致
类型参数的使用范围类型参数用于类声明和类实现中的成员函数和成员变量类型参数用于函数声明和函数定义中,也可以用于返回值和参数类型
自动数据类型推导不可以不可以

二,Typescript 的泛型声明

TypeScript 是 JavaScript 的一个超集(父集),增加了类型检查和其他的特性。在 TypeScript 中,你可以使用泛型来编写可重用的组件或函数,这些组件或函数可以处理多种数据类型。

?

// 泛型声明  
function printValue<T>(value: T): void {  
    console.log(value);  
}
  • function printValue<T>(value: T): void:这句话定义了一个泛型函数?printValue,它接受一个参数?value,其类型由泛型?T?决定,并返回?void(即没有返回值)。
  • console.log(value):打印传入的?value

?<T>表示定义模板类型,(value: T): T 表示参数和返回值类型都是同一个类型,
具体T是什么类型就实参决定。

C++模板TypeScript泛型
定义方式使用关键字 "template" 来定义函数或类模板使用泛型符号 "<>" 在函数或类声明中定义泛型
类型参数template<typename T1, typename T2>;
(注意这里typename要大写)
<T1, T2>
(C++和TypeScript都可以使用多个类型)
类型检查编译时进行类型检查,可以优化代码运行时进行类型检查,可能影响性能
函数模板/泛型函数

template<typename T>?T add(T a, T b)

{
return a + b;
}

function add<T>(a: T, b: T): T

{
return a + b;
}

类模板/泛型类template<typename T>?class Box { public: T content; Box(T value); };

class Box<T>?

{
public: T content; Box(T value);
};

?

?

文章来源:https://blog.csdn.net/IDdaxia/article/details/135476670
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。