首页 > 编程语言 >C++(模板)

C++(模板)

时间:2024-08-06 11:50:08浏览次数:7  
标签:elements 函数 C++ 参数 template push 模板

目录



在C++中,模板是泛型编程的重要工具,用于编写通用和可重用的代码。模板主要有两种类型:函数模板和类模板。



1. 函数模板(Function Templates)

函数模板允许你定义一个函数,其操作可以应用于不同的数据类型。它们可以在编译时生成多个版本的函数,以适应不同的数据类型。

1.1 基本语法:

template <typename T>
T max(T a, T b) {
    return (a > b) ? a : b;
}

这里,template <typename T> 定义了一个模板,其中 T 是一个类型参数。max 函数可以接受任意类型的参数,只要这两个参数的类型相同。

1.2 使用示例:

int main() {
    cout << max(10, 20) << endl;    // 使用int
    cout << max(10.5, 20.5) << endl; // 使用double
    return 0;
}

C++编译器根据调用 max 函数时的参数类型自动生成相应的函数版本。



2. 类模板(Class Templates)

类模板允许你定义一个类,其数据成员和成员函数可以依赖于模板参数。这使得类可以处理不同的数据类型。

2.1 基本语法:

template <typename T>
class Stack {
private:
    vector<T> elements;
public:
    void push(const T& element) {
        elements.push_back(element);
    }
    T pop() {
        if (elements.empty()) throw out_of_range("Stack<>::pop(): empty stack");
        T elem = elements.back();
        elements.pop_back();
        return elem;
    }
    bool empty() const {
        return elements.empty();
    }
};

这里,template <typename T> 定义了一个类模板,T 是一个类型参数。Stack 类可以处理任意类型的数据。

2.2 使用示例:

int main() {
    Stack<int> intStack;
    intStack.push(1);
    intStack.push(2);
    cout << intStack.pop() << endl;  // 输出 2

    Stack<string> stringStack;
    stringStack.push("hello");
    stringStack.push("world");
    cout << stringStack.pop() << endl; // 输出 "world"

    return 0;
}


3. 模板的特性

  1. 模板特化(Template Specialization)

    • 全特化:为特定类型提供特定实现。

      template <>
      class Stack<bool> {
          // 特化版本的实现
      };
      
    • 偏特化:为模板参数的某些组合提供特定实现。

      template <typename T>
      class Pair<T, T> {
          // 特化版本的实现
      };
      
  2. 非类型模板参数
    模板参数不仅可以是类型,也可以是常量值。

    template <int size>
    class Array {
        int arr[size];
    };
    
  3. 模板递归
    可以在模板中进行递归定义,用于编写复杂的编译时计算。

模板机制提供了极大的灵活性和重用性,是C++语言强大的特性之一。



标签:elements,函数,C++,参数,template,push,模板
From: https://www.cnblogs.com/keye/p/18344875

相关文章

  • C++(匿名命名空间)
    目录1.定义和使用2.匿名命名空间的作用3.与static的比较4.多文件的情况5.使用场景6.注意事项在C++中,匿名命名空间是一种特殊的命名空间,它没有名字。匿名命名空间的主要作用是限制其作用域,使得其中定义的符号(例如变量、函数、类等)仅在定义它们的翻译单元(即源文件)中可......
  • C++(命名空间)
    目录1.定义命名空间2.使用命名空间3.命名空间的嵌套4.命名空间的使用别名5.命名空间的合并6.命名空间的匿名命名空间7.标准库命名空间在C++中,命名空间(namespace)用于组织代码并防止命名冲突。它们可以将相关的类、函数和变量组织在一起,以避免不同库或代码片段中可能出......
  • 【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值
    C++语法相关知识点可以通过点击以下链接进行学习一起加油!命名空间缺省参数与函数重载本章将分享C++增加的几种常见特性,主要内容为引用与内联函数|auto关键字与for循环|指针空值,这些知识看似很多,实际也不少。本章篇幅长,耐心享用,若有不足,欢迎指出!......
  • 定义一个C++的类,析构的时候输出当前函数执行耗时
    背景介绍:有时候我们需要知道一个函数的执行耗时。按照传统方法,至少要定义一个start,end,然后计算差值,输出差值,4个步骤。这里,我们定义一个  ElapseMillsec类,然后在类的生命周期结束的时候,在析构函数里面计算出差值。此时  ElapseMillsec类的生命周期,就是函数执行耗......
  • C++(虚函数实现多态基本原理)
    目录1.概念2.示例3.总结在C++中,加上virtual关键字可以实现多态,这是因为它允许函数在基类和派生类中有不同的实现,并确保在运行时正确调用派生类的方法。具体来说,这种机制称为“动态绑定”或“运行时多态”。1.概念虚函数(VirtualFunction):当你在基类中声明一个函数......
  • C++11革新之旅:探索C++编程的无限可能
    C++11革新之旅:探索C++编程的无限可能C++11,作为C++语言的一个重要标准,为C++编程带来了革命性的变革。它不仅引入了众多新特性和改进,还极大地增强了C++的表达能力、提高了程序的性能和资源利用率。本文将从多个方面深入探讨C++11的新特性,并解析这些特性如何改变C++编程的方式......
  • windows C++-使用 C++/WinRT 创作 API(一)
    这个系列中的"投影”不太好有准确的翻译,它的原文是"projection",最开始我觉得可能翻译为实现,但C++本身也有"实现(implementation )",这两个不同的词翻译为一个总觉得怪怪的。本文展示了如何直接或间接使用winrt::implements基本结构来拓展创作C++/WinRTAPI。在此上......
  • windows C++-使用 C++/WinRT 创作 API(二)
    可扩展应用程序标记语言(XAML)是一种声明性语言。具体来讲,XAML可初始化对象和设置对象的属性,使用一种可显示多个对象间分层关系的语言结构,还使用了一种支持类型扩展的支持类型约定。可以在声明性XAML标记中创建可见的UI元素。然后,可以为每个XAML文件关联单独的代码隐藏......
  • C++ 拷贝构造函数语义与移动构造函数语义
    拷贝构造函数语义与移动构造函数语义一、拷贝构造函数语义1.编译器生成拷贝构造函数的条件2.自定义拷贝构造函数3.深拷贝与浅拷贝4.拷贝构造函数的使用场景5.拷贝赋值运算符6.规则五(RuleofFive)二、移动构造函数语义1.禁止生成移动构造函数2.生成移动构造函数......
  • Codeforces Round 963 (Div. 2) A - C 详细题解(思路加代码,C++,Python) -- 来自灰名
    比赛链接:Dashboard-CodeforcesRound963(Div.2)-Codeforces之后有实力了再试试后面的题目,现在要做那些题,起码要理解一个多小时题目A:链接:Problem-A-Codeforces题目大意理解:        极少数不考翻译能读懂的cf题目(bushi)每个测试用例第一行一个n,......