iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >如何在C++项目中实现模板中的非类型参数
  • 405
分享到

如何在C++项目中实现模板中的非类型参数

2023-06-06 17:06:40 405人浏览 独家记忆
摘要

这篇文章给大家介绍如何在c++项目中实现模板中的非类型参数,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。非类型模板参看,顾名思义,模板参数不限定于类型,普通值也可作为模板参数。在基于类型的模板中,模板实例化时所依赖的是

这篇文章给大家介绍如何在c++项目中实现模板中的非类型参数,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

非类型模板参看,顾名思义,模板参数不限定于类型,普通值也可作为模板参数。在基于类型的模板中,模板实例化时所依赖的是某一类型的模板参数,你定义了一些模板参数(template<typename T>)未加确定的代码,直到模板被实例化这些参数细节才真正被确定。而非类型模板参数,面对的未加确定的参数细节是指(value),而非类型。当要使用基于值的模板时,你必须显式地指定这些值,模板方可被实例化。

在函数模板中使用非类型参数

#include<iOStream>using namespace std;//在函数模板中使用非类型参数template<class T>void Swap(T &a, T &b);template<typename T, unsigned N>void Swap(T (&a)[N],T (&b)[N]);template<typename T, unsigned N>void printArray(T (&arr)[N]);int main(){ int m = 10, n = 90; Swap(m,n); cout << "m = " << m << ", n = " << n << endl; int a[5] = { 1, 2, 3, 4, 5 }; int b[5] = { 10, 20, 30, 40, 50 }; Swap(a, b); printArray(a); printArray(b); return 0;}template<class T> void Swap(T &a,T &b){ T temp = a; a = b; b = temp;}template<class T, unsigned N> void Swap(T (&a)[N],T (&b)[N]){ T temp; for (int i = 0; i < N;i++){ temp = a[i];  a[i] = b[i]; b[i] = temp; }}template<typename T, unsigned N>void printArray(T (&arr)[N]){ for (int i = 0; i < N;i++){ if (i == N-1){  cout << arr[i] << endl; } else{  cout << arr[i] << ", "; } }}

在类模板中使用非类型参数

#include<iostream>#include<cstring>#include<cstdlib>using namespace std;//动态数组实现,在类模板中使用非类型参数template<typename T,int N>class Array{public: Array(); ~Array();public: T & operator[](int i);//重载下标运算符 int length() const{ return m_length; }//获取数组长度 bool capacity(int n);//是否可改变数组容量private: int m_length;//数组当前长度 int m_capacity;//当前内存容量 T *m_p;//指向数组内存的指针};template<typename T,int N>Array<T, N>::Array(){ m_p = new T[N]; m_capacity = m_length = N;}template<typename T,int N>Array<T, N>::~Array(){ delete[] m_p;}template<typename T,int N>T & Array<T, N>::operator[](int i){ if (i<0||i>=m_length){ cout << "Exception:Array index out of bounds!" << endl; } return m_p[i];}template<typename T,int N>bool Array<T, N>:: capacity(int n){ if (n>0){ int len = m_length + n; if (len<=m_capacity){  m_length = len;  return true; } else{  T *pTemp = new T[m_length + 2 * n*sizeof(T)];  if (NULL==pTemp){  cout << "Exception: Failed to allocate memory!";  return false;  }  else{   memcpy(pTemp,m_p,m_length*sizeof(T));  delete[] m_p;  m_p = pTemp;  m_capacity = m_length = len;  } } } else{ int len = m_length - abs(n); if (len<0){  cout << "Exception:Array length is too small!" << endl;  return false; } else{  m_length = len;  return true; } }}int main(){ Array<int, 5> arr; for (int i = 0, len = arr.length(); i < len;i++){ arr[i] = 2 * i; } cout << "first print:" << endl; for (int i = 0, len = arr.length(); i < len;i++){ cout << arr[i] << " "; } cout << endl; //扩大容量为增加的元素赋值 arr.capacity(8); for (int i = 5, len = arr.length(); i < len;i++){ arr[i] = 2 * i; } cout << endl; cout << "second print:" << endl; for (int i = 0, len = arr.length(); i < len;i++){ cout << arr[i] << " "; } cout << endl; arr.capacity(-4); cout << "third print: " << endl; for (int i = 0, len = arr.length(); i < len; i++){ cout << arr[i] << " "; } cout << endl; return 0;}

非类型模板参数的限制

非类型模板参数是有类型限制的。一般而言,它可以是常整数(包括enum枚举类型)或者指向外部链接对象的指针。

浮点数和类对象(class-type)不允许作为非类型模板参数:

template<double VAL>      // ERROR: 浮点数不可作为非类型模板参数double process(double v){  return v * VAL;}template<std::string name>   // ERROR:类对象不能作为非类型模板参数class MyClass{}稍作变通,我们即可使编译通过:template<double* PVAL>double process(const double& x){  return x * (*PVAL);}template<const char* name>class MyClass{  ...}

这样可顺利通过编译,但如果想在当前文件中使用这两个模板,还需要动一些手脚:

double val = 10;double res = process<&val>(20);   // ERROR: 表达式必须含有常量值MyClass<"hello"> x;         // ERROR: 模板参数不能引用非外部实体const char* s = "hello";MyClass<s> x;            // ERROR: 表达式必须含有常量值

这里就点出另外一点注意事项,也就是非类型模板参数的限制,非类型模板参数可以是指针,但该指针必须指向外部链接对象,还记得在A.cpp中如何引用B.cpp中的全局变量吗,在A.hpp中使用extern关键字对外部变量加以引用。

// B.cppdouble val = 3.14159265;char str[] = "hello";
// A.hppextern double val;extern char str[];
// A.cpp#include "A.hpp"double res = process<&val>(10);MyClass<str> x;

关于如何在C++项目中实现模板中的非类型参数就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

--结束END--

本文标题: 如何在C++项目中实现模板中的非类型参数

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

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

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何在C++项目中实现模板中的非类型参数
    这篇文章给大家介绍如何在C++项目中实现模板中的非类型参数,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。非类型模板参看,顾名思义,模板参数不限定于类型,普通值也可作为模板参数。在基于类型的模板中,模板实例化时所依赖的是...
    99+
    2023-06-06
  • C++函数模板非类型参数的注意事项有哪些呢
    本篇文章为大家展示了C++函数模板非类型参数的注意事项有哪些呢,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。C++编程语言中的模板应用是一个非常重要的应用技术。那么今天我们就先来了解一下有关C++函...
    99+
    2023-06-17
  • 如何使用 C++ 函数模板实现参数化类型?
    使用 c++++ 函数模板实现参数化类型简介函数模板可以处理不同类型的通用函数。参数化类型使函数模板更进一步,可以接受不同类型的参数。代码示例: 1. 定义函数模板 print_pai...
    99+
    2024-04-15
    函数模板 参数化类型 c++
  • C++非类型类模板参数的基本概念是什么
    C++非类型类模板参数的基本概念是什么,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。C++编程语言已经出现就立即引起了开发人员的注意,它具有C语言的所用功能,并...
    99+
    2023-06-17
  • C++ 函数模板中类型参数的使用技巧?
    使用类型参数技巧可以创建针对任何类型工作的通用 c++++ 函数模板,包括:声明类型参数:使用尖括号 和 typename 声明类型参数。使用类型参数:在函数体内使用类型参数作为类型声...
    99+
    2024-04-15
    c++ 函数模板
  • C++详解非类型模板参数Nontype与Template及Parameters的使用
    目录非类型类模板参数非类型函数模板参数非类型模板参数的限制非类型模板参数 auto非类型类模板参数 前一章使用的例子 Stack 使用的是标准库中的容器管理元素,也可以使用固定大小的...
    99+
    2024-04-02
  • 浅析C++模板类型中的原样转发和可变参数的实现
    目录原样转发的意义模板的可变参数总结原样转发的意义 前文我们实现了一个my_move函数,用来模拟stl的move操作,实现去引用的功能。其内部的原理就是通过remove_refer...
    99+
    2022-11-13
    C++ 原样转发 C++ 可变参数
  • C++ 函数模板中的类模板是如何使用的?
    C++ 函数模板中的类模板 C++ 函数模板可以感知类模板,并利用它们作为参数类型。这允许您创建通用函数,适用于各种数据类型和结构。 语法template<typename T&...
    99+
    2024-04-15
    c++ 函数模板 代码可读性
  • long数据类型如何在Java项目中使用
    这篇文章将为大家详细讲解有关long数据类型如何在Java项目中使用,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。在Java编程中经常遇到一些整数类型的使用问题,下面我们来看看长整形数据使用...
    99+
    2023-05-31
    java long ava
  • 模板化编程在大型软件项目中的作用?
    现代大型软件开发中,模板化编程可显著提高代码质量。它允许定义可重用代码,其行为取决于传递的参数,创建可适用于不同类型数据的单个容器实现。模板化编程的优点包括代码重用、类型安全性、可扩展性...
    99+
    2024-05-09
    模板化编程 大型软件项目 c++ 标准库
  • 在Java项目中如何实现一个可变参数列表
    这篇文章给大家介绍在Java项目中如何实现一个可变参数列表,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Java可变参数列表详解1、接受的传入参数情况:如public void test(String ...args)...
    99+
    2023-05-31
    jav 可变参数 列表
  • 如何理解 C++ 函数模板的类型推断?
    类型推断是 c++++ 函数模板中编译器自动推断函数模板参数类型的重要特性,根据函数参数类型或最合适类型推断模板参数类型。如 max() 函数模板可使用不同类型数组,因为编译器从数组元素...
    99+
    2024-04-24
    c++ 函数模板
  • 如何在Gluon中实现模型的初始化和参数设置
    在Gluon中,可以通过initialize()方法来对模型进行初始化,并通过collect_params()方法来获取模型的所有参...
    99+
    2024-04-02
  • c++类函数作为模板参数实现的方法是什么
    今天小编给大家分享一下c++类函数作为模板参数实现的方法是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。需求背景DB操作...
    99+
    2023-07-05
  • 解释器模式如何在Java项目中实现
    解释器模式如何在Java项目中实现?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。定义:给定一种语言,定义他的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中句子...
    99+
    2023-05-31
    java ava 解释器模式
  • 责任链模式如何在Java项目中实现
    这期内容当中小编将会给大家带来有关责任链模式如何在Java项目中实现,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。责任链模式责任链模式的定义:使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的...
    99+
    2023-05-31
    java 责任链模式 ava
  • 迭代器模式如何在java项目中实现
    迭代器模式如何在java项目中实现 ?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。java 迭代器模式实例详解首先,为什么使用迭代器模式,目的就是通过一个通用的迭代方法,隐...
    99+
    2023-05-31
    java 迭代器模式 ava
  • 如何利用 C++ 函数模板实现泛型编程?
    泛型编程通过函数模板实现,允许创建通用的代码处理不同类型的数据,无需修改源代码。函数模板的基本语法为:template returntype functionname(t arg1, ...
    99+
    2024-04-15
    泛型编程 c++函数模板 c++
  • 如何在Java项目中使用args参数数组
    如何在Java项目中使用args参数数组?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。传递普通参数public class Test { ...
    99+
    2023-06-06
  • 友元函数如何在类模板中使用?
    在类模板中使用友元函数允许外部函数访问私有成员。步骤:声明友元函数:在类模板中使用 "friend" 关键字。定义友元函数:使用类模板的类型参数,使其适用于所有类型。使用友元函数:像调用...
    99+
    2024-04-17
    类模板 友元函数
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作