返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++非模板类型参数怎么用
  • 172
分享到

C++非模板类型参数怎么用

2023-06-26 06:06:14 172人浏览 八月长安
摘要

本篇内容介绍了“c++非模板类型参数怎么用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、非模板类型参数分类:模板参数分类类型形参与非类型

本篇内容介绍了“c++非模板类型参数怎么用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

    一、非模板类型参数

    分类:

    模板参数分类类型形参与非类型形参

    概念:

    类型形参:

    出现在模板参数列表中,跟在class或者typename之类的参数类型名称

    非类型形参:

    用一个常量作为类(函数)模板的一个参数,在类(函数)模板中可将该参数当成常量来使用

    示例:

    namespace cole{// 定义一个模板类型的静态数组template<class T, size_t N = 10>class array{public:T& operator[](size_t index) { return _array[index]; }const T& operator[](size_t index)const { return _array[index]; }size_t size()const { return _size; }bool empty()const { return 0 == _size; }private:T _array[N];size_t _size;};}

    注意:

    浮点数、类对象以及字符串是不允许作为非类型模板参数的

    非类型的模板参数必须在编译期就能确认结果

    二、模板特化

    概念:

    使用模板可以实现一些与类型无关的代码,但对于一些特殊类型的可能会得到一些错误的结果

    示例:

    template<class T>bool IsEqual(const T& left, const T& right){return left == right;}// 函数模板的特化 (针对某些类型的特殊化处理)//bool IsEqual(const char* const & left,const char* const & right)bool IsEqual(const char* left, const char* right){return strcmp(left, right) == 0;}int main(){cout << IsEqual(1, 2) << endl;char p1[] = "hello";char p2[] = "hello";cout << IsEqual(p1, p2) << endl;;return 0;}

    特殊化结果:

    C++非模板类型参数怎么用

     不做特殊化结果:

     C++非模板类型参数怎么用

    注:此时对于字符串比较就需要对模板进行特化(在原模板类的基础上,针对特殊类型所进行特殊化的实现方式)

    特化分类:

    函数模板特化类模板特化

    1、函数模板特化

    函数模板的特化步骤:

    • 必须要先有一个基础的函数模板

    • 关键字template后面接一对空的尖括号<>

    • 函数名后跟一对尖括号,尖括号中指定需要特化的类型

    • 函数形参表: 必须要和模板函数的基础参数类型完全相同,如果不同编译器可能会报一些奇怪的错误

    示例:

    template<class T>bool IsEqual(const T left, const T right){return left == right;}template<>bool IsEqual<char*>(char* left,char* right){if (strcmp(left, right) == 0)return true;return false;}

    结果:

     C++非模板类型参数怎么用

    注:一般情况下如果函数模板遇到不能处理或者处理有误的类型,为了实现简单通常都是将该函数直接给出

    示例:

    bool IsEqual(char* left, char* right){if (strcmp(left, right) == 0)return true;return false;}

    2、类模板特化

    1)全特化

    概念:

    全特化即是将模板参数列表中所有的参数都确定化

    示例:

    template<class T1, class T2>class Data{public:Data() { cout << "Data<T1, T2>" << endl; }private:T1 _d1;T2 _d2;};template<>class Data<int, char>{public:Data() { cout << "Data<int, char>" << endl; }private:int _d1;char _d2;};void TestVector(){Data<int, int> d1;Data<int, char> d2;}
    2)偏特化

    概念:

    任何针对模版参数进一步进行条件限制设计的特化版本

    偏特化有以下两种表现方式:

    部分特化

    将模板参数类表中的一部分参数特化

    示例:

    // 将第二个参数特化为inttemplate <class T1>class Data<T1, int>{public:Data() { cout << "Data<T1, int>" << endl; }private:T1 _d1;int _d2;};// 将第二个参数特化为inttemplate <class T1>class Data<T1, int>{public:Data() { cout << "Data<T1, int>" << endl; }private:T1 _d1;int _d2;};

    参数更进一步的限制

    偏特化并不仅仅是指特化部分参数,而是针对模板参数更进一步的条件限制所设计出来的一个特化版本

    示例:

    //两个参数偏特化为指针类型template <typename T1, typename T2>class Data <T1*, T2*>{public:Data() { cout << "Data<T1*, T2*>" << endl; }private:T1 _d1;T2 _d2;};//两个参数偏特化为引用类型template <typename T1, typename T2>class Data <T1&, T2&>{public:Data(const T1& d1, const T2& d2): _d1(d1), _d2(d2){cout << "Data<T1&, T2&>" << endl;}private:const T1& _d1;const T2& _d2;};void test2(){Data<double, int> d1; // 调用特化的int版本Data<int, double> d2; // 调用基础的模板Data<int*, int*> d3; // 调用特化的指针版本Data<int&, int&> d4(1, 2); // 调用特化的指针版本}//两个参数偏特化为指针类型template <typename T1, typename T2>class Data <T1*, T2*>{public:Data() { cout << "Data<T1*, T2*>" << endl; }private:T1 _d1;T2 _d2;};//两个参数偏特化为引用类型template <typename T1, typename T2>class Data <T1&, T2&>{public:Data(const T1& d1, const T2& d2): _d1(d1), _d2(d2){cout << "Data<T1&, T2&>" << endl;}private:const T1& _d1;const T2& _d2;};void test2(){Data<double, int> d1; // 调用特化的int版本Data<int, double> d2; // 调用基础的模板Data<int*, int*> d3; // 调用特化的指针版本Data<int&, int&> d4(1, 2); // 调用特化的指针版本}

    三、模板分离编译

    分离编译概念:

    一个程序(项目)由若干个源文件共同实现,而每个源文件单独编译生成目标文件,最后将所有目标文件链接起来形成单一的可执行文件的过程称为分离编译模式

    模板分离编译:

    假如有以下场景,模板的声明与定义分离开,在头文件中进行声明,源文件中完成定义

    示例:

    // a.htemplate<class T>T Add(const T& left, const T& right);// a.cpptemplate<class T>T Add(const T& left, const T& right){return left + right;}// main.cpp#include"a.h"int main(){Add(1, 2);Add(1.0, 2.0);return 0;}

    注:以上代码的模板分离编译会报错

    分析: 

    C++非模板类型参数怎么用

    解决方法

    将声明和定义放到一个文件 “xxx.hpp” (h文件和cpp文件结合)里面或者xxx.h其实也是可以的(推荐)

    模板定义的位置显式实例化(不实用)

    四、模板总结

    优点:

    • 模板复用了代码,节省资源,更快的迭代开发C++的标准模板库(STL)因此而产生

    • 增强了代码的灵活性

    缺陷:

    • 模板会导致代码膨胀问题,也会导致编译时间变长(为了尽量减少此类问题,编译器会按需实例化)

    • 出现模板编译错误时,错误信息非常凌乱,不易定位错误

    • 不支持分离编译

    “C++非模板类型参数怎么用”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

    --结束END--

    本文标题: C++非模板类型参数怎么用

    本文链接: https://lsjlt.com/news/307189.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    猜你喜欢
    • C++非模板类型参数怎么用
      本篇内容介绍了“C++非模板类型参数怎么用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、非模板类型参数分类:模板参数分类类型形参与非类型...
      99+
      2023-06-26
    • C++非类型类模板参数的基本概念是什么
      C++非类型类模板参数的基本概念是什么,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。C++编程语言已经出现就立即引起了开发人员的注意,它具有C语言的所用功能,并...
      99+
      2023-06-17
    • C++模板非类型形参的详细讲解
      前言 关于模板的非类型形参,网上有很多内容,C++primer只有大概一页的阐述,但是都不够清晰详细。下面我尽可能从自己的角度去给大家描述一下非类型形参的相关细节。如果想进一步理解非...
      99+
      2024-04-02
    • C++详解非类型模板参数Nontype与Template及Parameters的使用
      目录非类型类模板参数非类型函数模板参数非类型模板参数的限制非类型模板参数 auto非类型类模板参数 前一章使用的例子 Stack 使用的是标准库中的容器管理元素,也可以使用固定大小的...
      99+
      2024-04-02
    • C++函数模板非类型参数的注意事项有哪些呢
      本篇文章为大家展示了C++函数模板非类型参数的注意事项有哪些呢,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。C++编程语言中的模板应用是一个非常重要的应用技术。那么今天我们就先来了解一下有关C++函...
      99+
      2023-06-17
    • 如何在C++项目中实现模板中的非类型参数
      这篇文章给大家介绍如何在C++项目中实现模板中的非类型参数,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。非类型模板参看,顾名思义,模板参数不限定于类型,普通值也可作为模板参数。在基于类型的模板中,模板实例化时所依赖的是...
      99+
      2023-06-06
    • C++ 函数模板中类型参数的使用技巧?
      使用类型参数技巧可以创建针对任何类型工作的通用 c++++ 函数模板,包括:声明类型参数:使用尖括号 和 typename 声明类型参数。使用类型参数:在函数体内使用类型参数作为类型声...
      99+
      2024-04-15
      c++ 函数模板
    • 如何使用 C++ 函数模板实现参数化类型?
      使用 c++++ 函数模板实现参数化类型简介函数模板可以处理不同类型的通用函数。参数化类型使函数模板更进一步,可以接受不同类型的参数。代码示例: 1. 定义函数模板 print_pai...
      99+
      2024-04-15
      函数模板 参数化类型 c++
    • C++泛型编程函(数模板+类模板)
      目录一、函数模板1.函数模板介绍2.函数模板与重载函数的关系3.函数模板实现机制二、类模板1.类模板基本语法2.类模板内函数的整体布局【分文件使用类模板】3.类模板的static与模...
      99+
      2024-04-02
    • C++ 函数参数详解:参数类型推导与模板函数的使用
      c++++ 参数类型推导和模板函数:参数类型推导: auto 关键字可自动推断参数类型,简化声明并增强可读性。模板函数: 可接受不同类型数据,根据类型执行不同操作,语法:template...
      99+
      2024-04-27
      c++ 函数参数
    • C++11怎么声明模板类型为形参或友元
      本篇内容介绍了“C++11怎么声明模板类型为形参或友元”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!在新标准中,我们可以将模板类型参数声明为...
      99+
      2023-06-19
    • C++11可变参数模板怎么使用
      本篇内容主要讲解“C++11可变参数模板怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C++11可变参数模板怎么使用”吧!可变参数函数C语言中,可变参数函数可以说是一个比较神奇的存在。例...
      99+
      2023-06-19
    • C++ 函数模板的类型推导机制
      函数模板通过类型推导机制在编译时推断返回类型和类型,允许使用不同类型参数创建通用函数或类。类型推导规则包括:完美转发:模板参数从函数原型中的参数类型直接传递;模板参数推断:编译器从参数类...
      99+
      2024-04-13
      类型推导 函数模板 c++
    • C++ 函数模板和类模板详情
      目录1. 泛型编程 2. 函数模板 2.1 函数模板概念 2.2 函数模板格式化 2.3 函数模板原理 2.4 函数模板实例化 2.5 模板参数的匹配原理 3. 类模板 3.1 类模...
      99+
      2024-04-02
    • C++函数模板和类模板分析
      本篇内容介绍了“C++函数模板和类模板分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1.函数模板函数模板定义了参数化的非成员函数,这使得...
      99+
      2023-06-17
    • 浅析C++函数模板和类模板
      目录一、函数模板1、函数模板的定义和使用2、函数模板的编译原理3、函数模板的声明二、类模板1、类模板的定义和使用2、类模板的编译原理3、类模板的继承和派生C++语言全盘继承了C语言的...
      99+
      2024-04-02
    • C#中ParameterDirection参数类型怎么定义
      在C#中,可以使用System.Data.ParameterDirection枚举定义ParameterDirection参数类型。...
      99+
      2023-09-26
      C#
    • C++ 中模板类和模板函数的应用场景?
      模板类和模板函数在 c++++ 中通过参数化类型提供代码重用性。模板类允许创建通用类,如容器类,适用于各种数据类型。模板函数允许创建处理不同数据类型的函数,如排序算法和数学函数。通过使用...
      99+
      2024-04-24
      模板函数 模板类 c++ 标准库
    • 【C++】C++11语法 ~ 可变参数模板
      🌈欢迎来到C++专栏~可变参数模板 ...
      99+
      2023-08-17
      c++ java 开发语言
    • c++类函数作为模板参数实现方式详解
      目录需求背景实现方式struct + operatorPass Function Signature需求背景 DB操作有四种基本操作:Insert、Update、Delete和Que...
      99+
      2023-03-01
      c++ 类函数作为模板参数 c++ 类函数
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作