请选择 进入手机版 | 继续访问电脑版
查看: 4487|回复: 0

[C/C++] 在 C++ 中使用模板

[复制链接]
  • TA的每日心情
    开心
    2021-10-18 01:53
  • 签到天数: 41 天

    [LV.5]常住居民I

    发表于 2021-9-2 10:45:39 | 显示全部楼层 |阅读模式
    这是一个关于 C++ 模板的简短教程。

    读者:对C++有一点了解的人

    免责声明:尽管这是我写的一篇文章,但我已经使用了来自各个网站的信息作为参考。所以我不能声称它完全是我自己的文章。另外,请原谅我犯的任何错误。

    那我们开始吧。

    您对函数进行了多少次编码,并考虑过它是否适用于不同的数据类型。或者您编写一个类并希望为各种数据类型实现相同的类。

    一个非常简单的例子是添加函数。

    [AppleScript] 纯文本查看 复制代码
    int add(int a,int b)
    {
      return(a+b);
    }


    如果我们可以使用相同的函数来添加整数、长整数和浮点值,那不是很好吗?这就是模板发挥作用的地方。

    模板:
    基本上,模板使您的函数或类更加抽象,以便您可以为不同的数据类型实现单个类//函数。

    我们现在可以将我们的模板分类为函数模板和类模板。

    我们将首先处理函数模板。

    函数模板
    函数模板允许函数处理不同的数据类型。这可以使用模板参数来实现。模板参数是一种特殊的参数,可用于将类型作为参数传递:就像常规函数参数可用于将值传递给函数一样,模板参数也允许将类型传递给函数。这些函数模板可以像使用任何其他常规类型一样使用这些参数。

    其语法是:
    [AppleScript] 纯文本查看 复制代码
    template <class identifier> function_declaration;
    template <typename identifier> function_declaration;


    要使用特定数据类型调用函数,我们使用:
    [AppleScript] 纯文本查看 复制代码
    function_name <datatype> (arguments);


    我们将看一个例子来了解更多。
    [AppleScript] 纯文本查看 复制代码
    template <class T>
    T add (T a, T b) {
     return (a+b);
    }


    上面,我们已经创建了一个带有模板参数 T 的模板函数。现在,这个参数 T 代表一个尚未定义的类型。我们稍后可以将此参数定义为我们喜欢的数据类型。

    这是 main() 部分中的函数调用:
    [AppleScript] 纯文本查看 复制代码
    int x=2,y=3;
    float a=10.3,b=6.2;
    
    int integerSum = add <int> (x,y);
    float realSum  = add <float> (a,b);
    
    cout<<"Integer Sum = "<<integerSum;
    cout<<"nFloat Sum = "<<realSum;


    输出将是

    [AppleScript] 纯文本查看 复制代码
    Integer Sum = 5
    
    我们现在可以分析我们是如何做到的。在主体中,我们首先声明我们的变量,x 和 y 是整数,a,b 是浮点数。
    
    接下来,有一个整数变量 integerSum,它接受 add() 函数的结果。看看我们如何告诉函数我们正在使用整数。我们将参数的数据类型作为 <data type> 放在函数名和参数之间。所以,现在编译器知道我们正在向函数发送整数值。所以它在将两个数字相加后返回一个整数。浮点值也是如此。
    
    此外,没有必要定义元素的数据类型。编译器会自动检查类型。因此,您可以将函数调用减少为:
    
    [mw_shl_code=applescript,true]int a=2,b=3,sum=0;
    sum=add(a,b);
    cout&lt;&lt;sum;

    Float Sum = 16.5[/mw_shl_code]

    如果我们想发送两种不同的类型怎么办。然后,稍微更改声明以接受两种不同的类型。那是:

    [AppleScript] 纯文本查看 复制代码
    template &lt;class T,class U&gt;
    
    和主体:
    
    [mw_shl_code=applescript,true]float a=2.35,result;
    int b=5;
    result=add(a,b); ////If you want, you can use result=add &lt;float,int&gt;(a,b);

    T add (T a, U b) {
    return (a+b);
    }[/mw_shl_code]

    所以,现在这将是关于函数模板的。我们现在可以转到类模板。

    类模板:
    类模板与函数模板相同,只是它们用于处理类。类模板在处理堆栈、树、图形等数据结构时非常有用。这里的成员可以使用模板参数作为类型。

    在下面的语法中, identifier 是指您为类型指定的名称类声明的语法是:
    [AppleScript] 纯文本查看 复制代码
    template &lt;class identifier&gt; class classname {....};
    Eg:
    template &lt;class T&gt; class add_class {.....};


    定义类的成员函数:
    [AppleScript] 纯文本查看 复制代码
    template &lt;class identifier&gt; identifier classname &lt;identifier&gt; :: function_name() {.....}
    Eg:
    template &lt;class T&gt; T add_class &lt;T&gt; :: sum() {....}


    要创建具有特定数据类型的类对象:
    [AppleScript] 纯文本查看 复制代码
    classname &lt;datatype&gt; object;
    Eg:
    add_class &lt;int&gt; obj1;


    我们可以使用与函数模板中使用的相同的加法示例。在这里,我们创建一个类添加:
    [AppleScript] 纯文本查看 复制代码
    template &lt;class T&gt;
    class add {
      T a,b;
      public:
        T add(T first,T second) 
        { a=first; b=second; }
        T sum()
        { return(a+b); }
    };

    上面,我们使用类添加。它有两个元素 a 和 b,它们是模板参数类型。我们必须稍后定义它。有一个构造函数为 a 和 b 赋值(因为 a 和 b 是私有的,我们必须使用这个构造函数)。还有一个成员函数 sum() 返回 a 和 b 的总和。

    现在让我们看看 main 函数中实际添加两个整数和两个浮点数的代码。
    [AppleScript] 纯文本查看 复制代码
    add &lt;int&gt; obj1(2,3);
    add &lt;float&gt; obj2(10.3,6.2);
    
    int res1 = obj1.sum();
    float res2 = obj2.sum();
    
    cout&lt;&lt;&quot;Integer sum = &quot;&lt;&lt;res1;
    cout&lt;&lt;&quot;nFloat sum = &quot;&lt;&lt;res2;


    在上面的代码中,我们创建了两个对象,obj1 和 obj2。obj1 是整数类型,obj2 是浮点数。也就是说,obj1 的元素 a 和 b 是整数,而 obj2 的元素是浮点数。我们使用构造函数在对象创建期间用值初始化 a 和 b。其余的代码很简单,如果您一直阅读本文,您就会理解它。

    关于模板还有更多要谈的,但现在,我有点累了。所以,我们将在这里结束我们的文章。关于模板还有更多要讨论的内容,但我们稍后会研究。模板使编程变得通用,从而使生活更轻松。C++ 中有标准模板库,它提供了许多预定义的类型,如堆栈、队列等

    [这是 cprogramming.com 关于 STL 的一小段]

    C++ 标准的最新版本之一是标准模板库 (STL)。STL 是一组抽象数据类型、函数和算法,旨在处理用户指定的数据类型。每个抽象数据类型还包含有用的函数,包括重载运算符,以访问它们。标准模板库的精神是泛型编程的思想——算法或数据结构的实现,而不依赖于所处理的数据类型。例如,您可以使用 STL 向量容器来存储您想要的任何对象的向量(将其视为可调整大小的数组)。在 C 和非 STL C++ 中,您可以使用数组来获得类似的功能,但数组仅限于单一类型的数据结构。此外,STL 提供了一些不错的功能,例如为您处理内存(无内存泄漏),

    希望你们喜欢这个教程,就给我回复一下你的意见,我们一起交流,我是by鬼神,中国红客联盟
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    快速回复 返回顶部 返回列表