首页 > 其他分享 >各类关键字

各类关键字

时间:2024-04-13 18:55:23浏览次数:16  
标签:__ const 代码 list 关键字 各类 template 模板

namespace

测试程序使用namespace包裹

示例代码:

#include <iostream>
#include <memory>
#include <list>
namespace jj01
{
void test_member_template() {}
}

namespace jj02
{
template<typename T>
using Lst = list<T, allocator<T>>;
void test_template_template_param() {}
}

int main(int argc, char** argv)
{
jj01::test_member_template();
jj02::test_template_template_param();
}

类模板

可以允许使用者任意指定的部分可以抽出成为模板

template<typename T>
// 使用的时候在指明类型
class complex
{
   public:
  complex (T r = 0. T i = 0) : re(r), im(i) {}
  complex& operator += (const complex&);
  T real() const {return re;}
  T imag() const {return im;}
   private:
  T re, im;s
}

函数模板

语法和类模板一样

template<typename T>
inline
const T& min(const T& a, const T& b) {return b < a ? b : a;}
// 使用的时候不需要指名类型 -> <符号的本质是操作符重载
stone r1(2, 3), r2(3, 3);
r3 = min(r1, r2);

成员模板

模板里面的member,该member本身又是一个template -> 模板内的模板 -> 主要用来设计构造函数

示例代码:

template<class T1, class T2>
struct pair
{
T1 first;
T2 second;
pair() : first(T1()), second(T2()) {}
pair(const T1& a, const T2& b) : first(a), second(b) {}

// 再设计模板
template<class U1, class U2>
pair(const pair<U1, U2>& p) : first(p.first), second(p.second) { }
};

模板特化

专门针对某一类型设计的函数

示例代码:

#pragma once
#ifndef __SPECIALIZATION__
#define __SPECIALIZATION__
template<class Key> // 要先有泛化.才有模板的特化
struct hash
{

};

template <>
struct hash<long>
{
size_t operator() (long x) const { return x; }
};

#endif // !__SPECIALIZATION__

partial specialization 模板偏特化(个数的偏特化,范围的偏特化)

个数偏特化:

template<typename T, typename Alloc=...>
class vector
{
   
}

T是指定函数类型.Alloc是指定函数的分配器(标准库的内容)

c++当中最小单位是char类型.八位,如果是bool类型那么只占用一位.那么就不需要使用泛化

实际上就是在声明模板的时候指定一个模板的泛化值是什么(类似声明形参的时候赋予初始值)

示例代码:

template<typename Alloc=...>
class vertor<bool, Alloc>
{
   
}

范围上的偏特化

如果设计一个模板特化类型T,但是他不是一个具体的类型.他是一个指针.指向任意类型.所以T的范围就缩小了

示例代码:

template<typename T>
class C
{

}

在声明一个指针的T

template<typename U>
class C<U*>
{
   
}

如果使用者用的是指针,编译器会使用下面一套代码.如果是指针,那么编译器会用上面一套代码

T*表示指向什么都可以

使用者声明方式:

c<string> obj1; // 使用上面一个T代码
c<string*> obj2; // 使用下面一个U*代码

template template parameter模板模板参数

声明一个模板.有两个参数.第二个参数也是一个模板

示例代码:

#pragma once
#ifndef __TEMPLATE__
#define __TEMPLATE__

template<typename T, template<typename T> class Container>
/* 在template尖括号的<>中间.typename和class是共通的 */
class XCls
{
public:

private:
Container<T> c; // 这个T是指前面的typename的T -> 这里写出的是list<string>
};

template<typename T>
using Lst = list<T, allocator<T>>

#endif // !__TEMPLATE__

目的是为了让使用者可以指定使用容器来构造类

容器需要指定元素类型和分配器

上面的模板模板声明完成后具体使用:

// 错误使用方式
// XCls<string, list> mylst1; -> list传入就是第二个Contrainer,会拿前面的T当前元素类型
// 之所以这里可以这样使用,是因为元素有第二模板参数.只是有默认值.如果这样使用语法过不了
// list的特性接收两个参数
XCls<string, Lst> mylst;

上诉代码当中传入的list并没有绑定任何参数,所以它仍然是一个模糊的东西.这样才可以把它称之为模板

无法通过的原因是:容器接收好几个参数

如果只接收一个参数那么是可以通过的

示例代码:

#pragma
#ifndef __TEMPLATETWO__
#define __TEMPLATETWO__

template<typename T, template<typename T> class SmartPtr>
class XCls
{
public:
XCls() : sp(new T) { }
private:
SmartPtr<T> sp;
};

#endif // !__TEMPLATETWO__

使用方式:

XCls<string, shared_ptr> p1;
// XCls<double, unique_ptr> p2; -> 由于unique_ptr的特性所以上述的声明方式进行这样构造是不可以的

非模板模板偏特化:

template<class T, class Sequence = deque<T>>
class stack {
friend bool operator== <> (const stack&, const stack&);
friend bool operator< <> (const stack&, const stack&);

protected:
Sequence c; // 底层容器
};

在这段代码当中,由于Sequence有默认初始值.所以在声明调用的时候有两种方式:

stack<int> s1;
stack<int, list<int>> s2;

在这个当中如果要修改第二个初始值.需要指定list<int>并且向list当中传入参数.那么它就不是一个模糊的值.而是一个被定义的值.所以不能视为模板

小结

模板是一个模糊的概念,不是一个确定的概念.它只有在使用的时候才会被确定

标签:__,const,代码,list,关键字,各类,template,模板
From: https://www.cnblogs.com/JunkingBoy/p/18133206

相关文章

  • having的用法 对分组后的数据进行条件过滤 ,HAVING语句通常与GROUP BY语句联合使用,用来
    having的用法HAVING语句通常与GROUPBY语句联合使用,用来过滤由GROUPBY语句返回的记录集。HAVING语句的存在弥补了WHERE关键字不能与聚合函数联合使用的不足。语法:SELECTcolumn1、column2、...column_n,aggregate_function(expression)。FROMtables。WHEREpredicates。GRO......
  • 【C++】深入理解 C++ 中的 auto 关键字
    深入理解C++中的auto关键字1.概念2.用法2.1基本用法2.2结合复杂类型2.3函数返回类型推导2.4使用auto处理复杂类型3.注意事项4.适用场景在C++11标准中引入了auto关键字,它是一项强大的特性,可以大大简化代码的书写,同时提高代码的可读性和灵活性。......
  • PHP中yield关键字的作用和示例
     php中的yield关键字是在php5.5版本引入的一个关键字,它在函数内部可以用来创建一个生成器(generator)。生成器可以用来遍历一个大数据集,而不需要一次性将整个数据集加载到内存中。yield关键字的作用是将当前函数变成一个生成器函数。在生成器函数内部,我们可以使用yield语句将......
  • Python中global和nonlocal关键字的妙用:变量管理技巧
        概要在Python中编写函数时,经常会遇到需要在函数内部访问和修改外部变量的情况。在这种情况下,我们可以使用 global 和 nonlocal 关键字来声明变量的作用域,以便正确地访问和修改这些变量。本文将深入探讨 global 和 nonlocal 的用法,包括详细的示例代码和......
  • C语言--extern关键字介绍
    在C语言中,extern关键字用于声明一个变量或函数是在其他地方定义的,而不是在当前文件中。它告诉编译器,变量的定义或函数的实现在其他地方,这样编译器就不会在当前编译单元中查找它们的定义。这样做的好处是可以将一个大型程序分割成多个源文件,每个源文件可以单独编译,最后链接成一......
  • 软件构造中的各类注释介绍与实例演示
    本文系笔者在学习软件构造课程期间所写,不保证通用性和正确性,仅供参考。目录前言SpecAbstractFunctionRepInvariantSafetyfromExposureTestingStrategy结语一、前言之前的代码中都不怎么重视注释,有注释也就是随便一两行解释一下下面的代码是干什么的。学习课......
  • UI自动化之设计模式--关键字驱动设计
    UI自动化测试框架:1.关键字驱动设计2.Excel数据驱动设计3.框架实现UI测试框架之设计模式:(一)设计模式介绍1.目前主流的测试框架的设计模式:*1.1关键字驱动:最核心,最传统的设计模式。基于关键字的形态来实现对业务的自动化执行。通过操作行为的封装或者是通过业务流程的封装......
  • 对文件内容特殊关键字做高亮处理
    效果:       对文件中指定的关键字(内容)做标记,适用于日志系统特殊化处理。比如对出现Error字段所在的行进行标红高亮       同时支持对关键字的管理以及关键在属性的设置下面是对内容高亮:voidMainWindow::displayDecodeResilt(constQString&textPath){......
  • python里yeild关键字有什么用?
    在Python中,yield关键字主要用于定义生成器(generator),这是一种特殊的迭代器。使用yield可以将一个函数转换成一个生成器,使得这个函数能够在每次迭代时返回一个值,并且能够保存当前的执行状态,以便下一次迭代时从上次离开的地方继续执行31017。这种特性使得生成器非常适合处理大......
  • C语言07-主函数、函数原型、作用域、static和extern关键字
    第11章函数11.1函数的基本概念1.什么是函数?函数是具有特定功能的代码块2.函数的分类库函数自定义函数11.2函数基本语法①声明函数(定义函数)函数四要素:①函数名,是标识符,需要满足标识符规范②函数体,该函数的代码块,写在{}中③返回值和返回类型,......