首页 > 其他分享 >模板相关的摘录总结

模板相关的摘录总结

时间:2023-08-22 11:25:47浏览次数:41  
标签:总结 const 函数 int template Test 模板 摘录

函数模板的实例化

隐式实例化 : 让编译器自己根据实参的类型推导模板参数的类型

template<class T>
T Add(const T& a, const T& b)
{
	return a + b;
}
int main()
{
	int a = 1, b = 2;
	cout << Add(a,b) << endl;
}

显示实例化 : 在函数名后的<>中指定模板参数的实际类型

template<class T>
T Add(const T& a, const T& b)
{
	return a + b;
}
int main()
{
	int a = 1;
	double b = 2.2;
	cout<<Add<int>(a,b)<<endl;
	cout<<Add<double>(a,b)<<endl;
}

非类型模板参数

#include<iostream>
using namespace std;
template<int a,int b>
int add1()
{
	return a + b;
}
template<class T,int a,int b>
int add2(T c)
{
	return c + a + b;
}
template<unsigned L1,unsigned L2>
int charscmp(const char(&p1)[L1],const char(&p2)[L2])
{
	return strcmp(p1, p2);
}
int main()
{
	cout << add1<1, 2>() << endl;
	cout << add2<int, 1, 2>(5) << endl;
	cout << add2<int, 1, 2>(1.6) << endl;
	cout << charscmp("test2", "test") << endl;
}

类模版

(1).类模板成员函数,可以写在类模板定义中,这种写在类模板定义中的成员函数会被隐式声明成inline函数
(2).类模板一旦被实例化之后,那么这个模板的每个实例都会有自己版本的成员函数,所以,类模板的成员函数是有模板参数的,因此,如果要把类模板成员函数的定义写到类模板定义的外面,须以关键字template开始,后接模板参数列表,同时,在类模板名后用<>将模板参数列表里的所有模板参数名列出来
(3).一个类模板可能有多个成员函数,当实例化模板以后,后续如果没有使用某个成员函数,则该成员函数不会实例化

template <typename T>    //类模板声明
class Stack
{
public:
    Stack();
    void push(T num);
    T pop();
    
    template<typename U>    //该成员函数不受T的限制,根据实际U的类型而定
    void print(U num)
    {
        cout<<num<<endl;
    }
private:
    int top;
    T data[SIZE];
}
 
template void print<int>(int num);  //即针对int类型只实例化一次,只生成一个模板函数;
 
int mian()
{
    Stack<int>s1;    //调用形式
 
    return 0;
}

非类型参数模版

template<class T,int size = 10>
class myarray
{
public:
	void func();
private:
	T arr[size];
};
template<class T,int size>
void myarray<T,size>::func()
{
	cout << size << endl;
	return;
}

类模板的特化

模板的全特化

//全特化
template<>//全特化,由于是全特化,参数都指定了,参数列表故为空。
class Stack<bool> {
private:
	std::deque<bool> elems; // 元素
public:
	void push(bool const&); // push元素
	void pop(); // pop元素
	bool top() const; // 传回 stack最顶端元素
	bool empty() const { // stack是否为空
		return elems.empty();
	}
};
void Stack<bool>::push(bool const& elem)
{
	elems.push_back(elem); // 追加元素
}
 
void Stack<bool>::pop()
{
	if (elems.empty()) {
 
		throw std::out_of_range("Stack<bool>::pop(): empty stack");
	}
	elems.pop_back(); // 移除最后一个元素
}
 
bool Stack<bool>::top() const
{
	if (elems.empty()) {
		throw std::out_of_range("Stack<bool>::top(): empty stack");
	}
	return elems.back(); // 传回最后一个元素的拷贝
}

模板的偏特化

#include <iostream>
 
using namespace std;
 
template<typename T1,typename T2>//定义模板类
 
class Test{
 
public:
 
    Test(T1 i,T2 j):a(i),b(j){cout<<"模板类"<<endl;}
 
private:
 
    T1 a;
 
    T2 b;
 
};
 
 
template<typename T2> //由于只指定了一部分参数,剩下的未指定的需在参数列表中,否则报错。
 
class Test<char,T2>{
 
public:
 
    Test(char i,T2 j):a(j),b(j){cout<<"个数偏特化"<<endl;}
 
private:
 
    char a;
 
    T2 b;
 
};
 
 
template<typename T1,typename T2> //这是范围上的偏特化
 
class Test<T1*,T2*>{
 
public:
 
    Test(T1* i,T2* j):a(i),b(j){cout<<"指针偏特化"<<endl;}
 
private:
 
    T1* a;
 
    T2* b;
 
};
 
template<typename T1,typename T2>//同理这也是范围上的偏特化
 
class Test<T1 const,T2 const>{
 
public:
 
    Test(T1 i,T2 j):a(i),b(j){cout<<"const偏特化"<<endl;}
 
private:
 
    T1 a;
 
    T2 b;
 
};
 
int main()
 
{
 
    int a;
 
    Test<double,double> t1(0.1,0.2);
 
    Test<int,char> t2(1,'A');
 
    Test<char,bool> t3('A',true);
 
    Test<int*,int*> t4(&a,&a);
 
    Test<const int,const int> t5(1,2);
 
    return 0;
 
}

类成员的函数模版(class member function templates)

#include <iostream>

template <typename T>
class Example {
   public:
      template <typename U>
      void print(T a, U b) {
         std::cout << "Arguments are: " << a << " and " << b << std::endl;
      }
};

int main() {
   Example<int> ex1;
   ex1.print(10, "hello");

   Example<std::string> ex2;
   ex2.print("world", 3.14);

   return 0;
}

这里,ClassName 是定义类的名称,T 是用于模板化类的类型参数,U 是用于模板化成员函数的类型参数。在类中定义的类成员函数模板可以用于成员函数的多态性,使成员函数可以适用于不同的数据类型,避免代码的重复编写。调用类成员函数模板时,需要指定模板参数,在编译时会自动生成适用于指定参数类型的成员函数

标签:总结,const,函数,int,template,Test,模板,摘录
From: https://www.cnblogs.com/wsl-hitsz/p/17648039.html

相关文章

  • Linux知识点总结
    【一】Linux引入【二】Linux初识【三】Linux之网络【四】Linux之Shell【五】Linux之文件管理【六】Linux之用户管理【七】Linux之基本权限【八】Linux之特殊权限【九】Linux之软件管理【十】Linux之系统服务【十一】Linux之进程管理【十二】Linux之计划任务【VIM编辑......
  • TemplateMethodPattern-模板方法模式
    在C#中,模板方法模式(TemplateMethodPattern)是一种行为型设计模式,它定义了一个算法的骨架,将某些步骤延迟到子类中实现。模板方法模式通过将公共的算法步骤抽象到基类中,并且通过在基类中定义一个模板方法来调用这些步骤,从而实现代码的复用和灵活性。模板方法模式有以下几个关键角......
  • HTML总结
    HTML标签常用标签标题标签h1~h6数字越大字体越小<h1>1<h2>2<h3>3<h4>4<h5>5<h6>6</h6></h5></h4></h3></h2></h1>段落标签p<p>这是一段</p><p>这是另一段</p>换行标签brbr:表示换行是一个单标签没有p段落标签那么大的间隙<p&......
  • 【RocketMQ】消息的存储总结
    当Broker收到生产者的消息发送请求时,会对请求进行处理,从请求中解析发送的消息数据,接下来以单个消息的接收为例,看一下消息的接收过程。数据校验封装消息首先Broker会创建一个MessageExtBrokerInner对象封装从请求中解析到的消息数据,它会将Topic信息、队列ID、消息内容、消息属性......
  • C++遍历TypeList(可变模板参数)的简单办法
        这里例举了两种方案,一种是基于C++17的constexpr,实现起来更精简。另外一种使用传统的方式,C++11就可以用了。    另外C++11的方案也是一种计算不定参数模板参数个数的方法。#include<iostream>#include<string>//inC++17#if((defined(_MSVC_LANG)......
  • Prompt-“设计提示模板:用更少数据实现预训练模型的卓越表现,助力Few-Shot和Zero-Shot任
    Prompt-“设计提示模板:用更少数据实现预训练模型的卓越表现,助力Few-Shot和Zero-Shot任务”通过设计提示(prompt)模板,实现使用更少量的数据在预训练模型(PretrainedModel)上得到更好的效果,多用于:Few-Shot,Zero-Shot等任务。1.背景介绍prompt是当前NLP中研究小样本学习方向上非常......
  • Visual Studio常用快捷键总结
    1、前进:ctrl+shift+-2、回退:ctrl+-3、查看定义和引用:F124、格式化文档:ctrl+K+D5、注释:ctrl+k+c,ctrl+k+u6、代码折叠:7、代码展开:8、断点调试:单行调试F10;进入F11;下一个断点F5; 10、添加断点:F911、删除所有断点:ctrl+shift+F9......
  • 高并发实战总结01
    一、短URL设计  对于需要展示短URL的应用程序,由该应用调用短URL生成器生成短URL,并将该短URL展示给用户,用户在浏览器中点击该短URL的时候,请求发送到短URL生成器(短URL生成器以HTTP服务器的方式对外提供服务,短URL域名指向短URL生成器),短URL生成器返回HTTP重......
  • CSAPP-Shell Lab总结
    提供的工具:parseline:获取参数列表char**argv,返回是否为后台运行命令(true)。clearjob:清除job结构。initjobs:初始化jobs链表。maxjid:返回jobs链表中最大的jid号。addjob:在jobs链表中添加jobdeletejob:在jobs链表中删除pid的job。fgpid:返回当前前台运行job的pid号。getjobp......
  • 【考后总结】8 月 CSP 模拟赛 8
    8.21CSP模拟27晴天-周杰伦故事的小黄花从出生那年就飘着童年的荡秋千随记忆一直晃到现在ReSoSoSiDoSiLaSoLaSiSiSiSiLaSiLaSo吹着前奏望着天空我想起花瓣试着掉落为你翘课的那一天花落的那一天教室的那一间我怎么看不见消失的下雨天我好想......