当前位置: 首页 > 编程日记 > 正文

C++ template

(转自http://www.cnblogs.com/gw811/archive/2012/10/25/2738929.html)

C++模板

模板是C++支持参数化多态的工具,使用模板可以使用户为类或者函数声明一种一般模式,使得类中的某些数据成员或者成员函数的参数、返回值取得任意类型。

模板是一种对类型进行参数化的工具;

通常有两种形式:函数模板类模板

函数模板针对仅参数类型不同的函数

类模板针对仅数据成员成员函数类型不同的类。

使用模板的目的就是能够让程序员编写与类型无关的代码。比如编写了一个交换两个整型int 类型的swap函数,这个函数就只能实现int 型,对double,字符这些类型无法实现,要实现这些类型的交换就要重新编写另一个swap函数。使用模板的目的就是要让这程序的实现与类型无关,比如一个swap模板函数,即可以实现int 型,又可以实现double型的交换。模板可以应用于函数和类。下面分别介绍。

注意:模板的声明或定义只能在全局,命名空间或类范围内进行。即不能在局部范围,函数内进行,比如不能在main函数中声明或定义一个模板。

一、函数模板通式


1、函数模板的格式:

template <class 形参名class 形参名,......返回类型 函数名(参数列表)

   {

      函数体

   }

其中template和class是关见字,class可以用typename 关见字代替,在这里typename 和class没区别,<>括号中的参数叫模板形参,模板形参和函数形参很相像,模板形参不能为空一但声明了模板函数就可以用模板函数的形参名声明类中的成员变量和成员函数,即可以在该函数中使用内置类型的地方都可以使用模板形参名。模板形参需要调用该模板函数时提供的模板实参来初始化模板形参,一旦编译器确定了实际的模板实参类型就称他实例化了函数模板的一个实例。比如swap的模板函数形式为

template <class T> void swap(T& a, T& b){},

当调用这样的模板函数时类型T就会被被调用时的类型所代替,比如swap(a,b)其中a和b是int 型,这时模板函数swap中的形参T就会被int 所代替,模板函数就变为swap(int &a, int &b)。而当swap(c,d)其中c和d是double类型时,模板函数会被替换为swap(double &a, double &b),这样就实现了函数的实现与类型无关的代码。

2、注意:对于函数模板而言不存在 h(int,int) 这样的调用,不能在函数调用的参数中指定模板形参的类型,对函数模板的调用应使用实参推演来进行,即只能进行 h(2,3) 这样的调用,或者int a, b; h(a,b)。

函数模板的示例演示将在下文中涉及!

二、类模板通式


1、类模板的格式为:

    template<class  形参名class 形参名>   class 类名

    { ... };

类模板和函数模板都是以template开始后接模板形参列表组成,模板形参不能为空,一但声明了类模板就可以用类模板的形参名声明类中的成员变量和成员函数,即可以在类中使用内置类型的地方都可以使用模板形参名来声明。比如

template<class T> class A{public: T a; T b; T hy(T c, T &d);};

在类A中声明了两个类型为T的成员变量a和b,还声明了一个返回类型为T带两个参数类型为T的函数hy。

2、类模板对象的创建:比如一个模板类A,则使用类模板创建对象的方法为A<int> m;在类A后面跟上一个<>尖括号并在里面填上相应的类型,这样的话类A中凡是用到模板形参的地方都会被int 所代替。当类模板有两个模板形参时创建对象的方法为A<int, double> m;类型之间用逗号隔开。

3、对于类模板,模板形参的类型必须在类名后的尖括号中明确指定。比如A<2> m;用这种方法把模板形参设置为int是错误的(编译错误:error C2079: 'a' uses undefined class 'A<int>'),类模板形参不存在实参推演的问题。也就是说不能把整型值2推演为int 型传递给模板形参。要把类模板形参调置为int 型必须这样指定A<int> m。

4、在类模板外部定义成员函数的方法为:

template<模板形参列表> 函数返回类型 类名<模板形参名>::函数名(参数列表){函数体},

比如有两个模板形参T1,T2的类A中含有一个void h()函数,则定义该函数的语法为:

template<class T1,class T2> void A<T1,T2>::h(){}。

注意:当在类外面定义类的成员时template后面的模板形参应与要定义的类的模板形参一致。

5、再次提醒注意:模板的声明或定义只能在全局,命名空间或类范围内进行。即不能在局部范围,函数内进行,比如不能在main函数中声明或定义一个模板。

三、模板的形参


有三种类型的模板形参:类型形参,非类型形参和模板形参。

1、类型形参

1.1 、类型模板形参:类型形参由关见字class或typename后接说明符构成,如template<class T> void h(T a){};其中T就是一个类型形参,类型形参的名字由用户自已确定。模板形参表示的是一个未知的类型。模板类型形参可作为类型说明符用在模板中的任何地方,与内置类型说明符或类类型说明符的使用方式完全相同,即可以用于指定返回类型,变量声明等。

作者原版:1.2、 不能为同一个模板类型形参指定两种不同的类型,比如template<class T>void h(T a, T b){},语句调用h(2, 3.2)将出错,因为该语句给同一模板形参T指定了两种类型,第一个实参2把模板形参T指定为int,而第二个实参3.2把模板形参指定为double,两种类型的形参不一致,会出错。(针对函数模板)

作者原版:1.2针对函数模板是正确的,但是忽略了类模板。下面将对类模板的情况进行补充。

本人添加1.2补充版(针对于类模板)、当我们声明类对象为:A<int> a,比如template<class T>T g(T a, T b){},语句调用a.g(2, 3.2)在编译时不会出错,但会有警告,因为在声明类对象的时候已经将T转换为int类型,而第二个实参3.2把模板形参指定为double,在运行时,会对3.2进行强制类型转换为3。当我们声明类的对象为:A<double> a,此时就不会有上述的警告,因为从int到double是自动类型转换。

演示示例1:

TemplateDemo.h

复制代码
 1 #ifndef TEMPLATE_DEMO_HXX
 2 #define TEMPLATE_DEMO_HXX
 3 
 4 template<class T> class A{
 5     public:
 6         T g(T a,T b);
 7         A();
 8 };
 9 
10 #endif
复制代码

TemplateDemo.cpp

复制代码
 1 #include<iostream.h>
 2 #include "TemplateDemo.h"
 3 
 4 template<class T> A<T>::A(){}
 5 
 6 template<class T> T A<T>::g(T a,T b){
 7     return a+b;
 8 }
 9 
10 void main(){
11     A<int> a;
12     cout<<a.g(2,3.2)<<endl;
13 }
复制代码

编译结果:

复制代码
1 --------------------Configuration: TemplateDemo - Win32 Debug--------------------
2 Compiling...
3 TemplateDemo.cpp
4 G:\C++\CDaima\TemplateDemo\TemplateDemo.cpp(12) : warning C4244: 'argument' : conversion from 'const double' to 'int', possible loss of data
5 
6 TemplateDemo.obj - 0 error(s), 1 warning(s)
复制代码

运行结果:      5 

我们从上面的测试示例中可以看出,并非作者原作中的那么严密!此处仅是本人跟人测试结果!请大家本着实事求是的态度,自行验证!

2、非类型形参

2.1 、非类型模板形参:模板的非类型形参也就是内置类型形参,如template<class T, int a> class B{};其中int a就是非类型的模板形参。

2.2、 非类型形参在模板定义的内部是常量值,也就是说非类型形参在模板的内部是常量。

2.3、 非类型模板的形参只能是整型,指针和引用,像double,String, String **这样的类型是不允许的。但是double &,double *,对象的引用或指针是正确的。

2.4、 调用非类型模板形参的实参必须是一个常量表达式,即他必须能在编译时计算出结果。

2.5 、注意:任何局部对象,局部变量,局部对象的地址,局部变量的地址都不是一个常量表达式,都不能用作非类型模板形参的实参。全局指针类型,全局变量,全局对象也不是一个常量表达式,不能用作非类型模板形参的实参。

2.6、 全局变量的地址或引用,全局对象的地址或引用const类型变量是常量表达式,可以用作非类型模板形参的实参

2.7 、sizeof表达式的结果是一个常量表达式,也能用作非类型模板形参的实参。

2.8 、当模板的形参是整型时调用该模板时的实参必须是整型的,且在编译期间是常量,比如template <class T, int a> class A{};如果有int b,这时A<int, b> m;将出错,因为b不是常量,如果const int b,这时A<int, b> m;就是正确的,因为这时b是常量。

2.9 、非类型形参一般不应用于函数模板中,比如有函数模板template<class T, int a> void h(T b){},若使用h(2)调用会出现无法为非类型形参a推演出参数的错误,对这种模板函数可以用显示模板实参来解决,如用h<int, 3>(2)这样就把非类型形参a设置为整数3。显示模板实参在后面介绍。

2.10、 非类型模板形参的形参和实参间所允许的转换
      1、允许从数组到指针,从函数到指针的转换。如:template <int *a> class A{}; int b[1]; A<b> m;即数组到指针的转换
      2、const修饰符的转换。如:template<const int *a> class A{}; int b; A<&b> m;   即从int *到const int *的转换。
      3、提升转换。如:template<int a> class A{}; const short b=2; A<b> m; 即从short到int 的提升转换
      4、整值转换。如:template<unsigned int a> class A{};   A<3> m; 即从int 到unsigned int的转换。
      5、常规转换。

非类型形参演示示例1:

由用户自己亲自指定栈的大小,并实现栈的相关操作。

TemplateDemo.h

复制代码
 1 #ifndef TEMPLATE_DEMO_HXX
 2 #define TEMPLATE_DEMO_HXX
 3 
 4 template<class T,int MAXSIZE> class Stack{//MAXSIZE由用户创建对象时自行设置
 5     private:
 6         T elems[MAXSIZE];    // 包含元素的数组
 7         int numElems;    // 元素的当前总个数
 8     public:
 9         Stack();    //构造函数
10         void push(T const&);    //压入元素
11         void pop();        //弹出元素
12         T top() const;    //返回栈顶元素
13         bool empty() const{     // 返回栈是否为空
14             return numElems == 0;
15         }
16         bool full() const{    // 返回栈是否已满
17             return numElems == MAXSIZE;
18         }
19 };
20 
21 template <class T,int MAXSIZE> 
22 Stack<T,MAXSIZE>::Stack():numElems(0){     // 初始时栈不含元素
23     // 不做任何事情
24 }
25 
26 template <class T,int MAXSIZE>
27 void Stack<T, MAXSIZE>::push(T const& elem){
28     if(numElems == MAXSIZE){
29         throw std::out_of_range("Stack<>::push(): stack is full");
30     }
31     elems[numElems] = elem;   // 附加元素
32     ++numElems;               // 增加元素的个数
33 }
34 
35 template<class T,int MAXSIZE>
36 void Stack<T,MAXSIZE>::pop(){
37     if (numElems <= 0) {
38         throw std::out_of_range("Stack<>::pop(): empty stack");
39     }
40     --numElems;               // 减少元素的个数
41 }
42 
43 template <class T,int MAXSIZE>
44 T Stack<T,MAXSIZE>::top()const{
45     if (numElems <= 0) {
46         throw std::out_of_range("Stack<>::top(): empty stack");
47     }
48     return elems[numElems-1];  // 返回最后一个元素
49 }
50 
51 #endif
复制代码

TemplateDemo.cpp

复制代码
 1 #include<iostream.h>
 2 #include <iostream>
 3 #include <string>
 4 #include <cstdlib>
 5 #include "TemplateDemo.h"
 6 
 7 int main(){
 8     try {
 9         Stack<int,20>  int20Stack;  // 可以存储20个int元素的栈
10         Stack<int,40>  int40Stack;  // 可以存储40个int元素的栈
11         Stack<std::string,40> stringStack; // 可存储40个string元素的栈
12 
13         // 使用可存储20个int元素的栈
14         int20Stack.push(7);
15         std::cout << int20Stack.top() << std::endl;    //7
16         int20Stack.pop();
17 
18         // 使用可存储40个string的栈
19         stringStack.push("hello");
20         std::cout << stringStack.top() << std::endl;    //hello
21         stringStack.pop();    
22         stringStack.pop();    //Exception: Stack<>::pop<>: empty stack
23         return 0;
24     }
25     catch (std::exception const& ex) {
26         std::cerr << "Exception: " << ex.what() << std::endl;
27         return EXIT_FAILURE;  // 退出程序且有ERROR标记
28     }
29 }
复制代码

运行结果:

非类型形参演示示例2:

TemplateDemo01.h

复制代码
 1 #ifndef TEMPLATE_DEMO_O1
 2 #define TEMPLATE_DEMO_01
 3 
 4 template<typename T> class CompareDemo{
 5     public:
 6         int compare(const T&, const T&);
 7 };
 8 
 9 template<typename T> 
10 int CompareDemo<T>::compare(const T& a,const T& b){
11     if((a-b)>0)
12         return 1;
13     else if((a-b)<0)
14         return -1;
15     else
16         return 0;
17 }
18 
19 #endif
复制代码

TemplateDemo01.cpp

复制代码
1 #include<iostream.h>
2 #include "TemplateDemo01.h"
3 
4 void main(){
5     CompareDemo<int> cd;
6     cout<<cd.compare(2,3)<<endl;
7 }
复制代码

运行结果:     -1 

复制代码
1 #include<iostream.h>
2 #include "TemplateDemo01.h"
3 
4 void main(){
5     CompareDemo<double> cd;
6     cout<<cd.compare(3.2,3.1)<<endl;
7 }
复制代码

运行结果:      1  

TemplateDemo01.h 改动如下:

复制代码
 1 #ifndef TEMPLATE_DEMO_O1
 2 #define TEMPLATE_DEMO_01
 3 
 4 template<typename T> class CompareDemo{
 5     public:
 6         int compare(T&, T&);
 7 };
 8 
 9 template<typename T> 
10 int CompareDemo<T>::compare(T& a,T& b){
11     if((a-b)>0)
12         return 1;
13     else if((a-b)<0)
14         return -1;
15     else
16         return 0;
17 }
18 
19 #endif
复制代码

TempalteDemo01.cpp

复制代码
1 #include<iostream.h>
2 #include "TemplateDemo01.h"
3 
4 void main(){
5     CompareDemo<int> cd;
6     int a=2,b=3;
7     cout<<cd.compare(a,b)<<endl;
8 }
复制代码

非类型形参演示示例3:

TemplateDemo02.cpp

复制代码
 1 #include<iostream.h>
 2 
 3 template<typename T>
 4 const T& max(const T& a,const T& b){
 5     return a>b ? a:b;
 6 }
 7 
 8 void main(){
 9     cout<<max(2.1,2.2)<<endl;//模板实参被隐式推演成double
10     cout<<max<double>(2.1,2.2)<<endl;//显示指定模板参数。
11     cout<<max<int>(2.1,2.2)<<endl;//显示指定的模板参数,会将函数函数直接转换为int。
12 }
复制代码

运行结果:

cout<<max<int>(2.1,2.2)<<endl;//显示指定的模板参数,会将函数函数直接转换为int。此语句会出现警告:
复制代码
1 --------------------Configuration: TemplateDemo02 - Win32 Debug--------------------
2 Compiling...
3 TemplateDemo02.cpp
4 G:\C++\CDaima\TemplateDemo02\TemplateDemo02.cpp(11) : 
  warning C4244: 'argument' : conversion from 'const double' to 'const int', possible loss of data 5 G:\C++\CDaima\TemplateDemo02\TemplateDemo02.cpp(11) :
  warning C4244: 'argument' : conversion from 'const double' to 'const int', possible loss of data 6 7 TemplateDemo02.obj - 0 error(s), 2 warning(s)


转载于:https://www.cnblogs.com/sunlightstoyou/p/10312329.html

相关文章:

js根据经纬度取随机附近经纬度

实现功能&#xff1a; 小程序根据当前经纬度得出随机的附近经纬度显示在地图上做标记点&#xff0c;效果图 实现代码 // map.js var app getApp() var mymap ; var lat ; var long ; var that;function latlog(lat, lon, d 1,d23) {var angle Math.random(1, 360);var …

讽刺笑话_完全不讽刺的2019年网络设计指南

讽刺笑话I’ve written about how to design for the modern web before, way back in 2018. But the web moves forward quickly so those guidelines are already obsolete and outdated, as more modern conventions have become mainstream.早在2018年&#xff0c;我就已经…

模拟城市2.0

题目背景 博弈正在机房颓一个叫做《模拟城市2.0》的游戏。 2048年&#xff0c;经过不懈努力&#xff0c;博弈终于被组织委以重任&#xff0c;成为D市市委书记&#xff01;他勤学好问&#xff0c;励精图治&#xff0c;很快把D市建设成富强民主文明和谐的美好城市。为了进一步深化…

bzoj:1221;vijos 1552 软件开发

Description 某软件公司正在规划一项n天的软件开发计划&#xff0c;根据开发计划第i天需要ni个软件开发人员&#xff0c;为了提高软件开发人员的效率&#xff0c;公司给软件人员提供了很多的服务&#xff0c;其中一项服务就是要为每个开发人员每天提供一块消毒毛巾&#xff0c;…

u-charts 曲线图中间有部分没数据,导致点和点无法连成线的问题解决

解决曲线图或者折线图在两端中间没有数据时无法绘画成线的问题源码修改, 解决方案: 在数据之间填充假数据,并且创建一个和点的数据同级的 list 来验证是不是假数据,如果是假数据就不绘制点,是真数据才绘制点,达到点和点之间没数据但是能连线的效果 先看效果图: 数据格…

python构建json_如何使用Python构建JSON API

python构建jsonThe JSON API specification is a powerful way for enabling communication between client and server. It specifies the structure of the requests and responses sent between the two, using the JSON format.JSON API规范是启用客户端和服务器之间通信的…

样式集 - 自适应居中弹窗

效果图&#xff1a; 弹窗1代码 <!-- 答题正确弹窗 --><block v-if"answer_true_show"><view class"answer_true_bg"></view><view class"answer_true"><img class"true_bg_img" :src"qualifyi…

struts2中 ServletActionContext与ActionContext区别

1. ActionContext 在Struts2开发中,除了将请求参数自动设置到Action的字段中,我们往往也需要在Action里直接获取请求(Request)或会话(Session)的一些信息,甚至需要直接对JavaServlet Http的请求(HttpServletRequest),响应(HttpServletResponse)操作. 我们需要在Action中取得req…

[记录]calculate age based on date of birth

calculate age based on date of birth know one new webiste:eval.in run php code转载于:https://www.cnblogs.com/fsong/p/5190273.html

有抱负的Web开发人员应考虑的6件事

Becoming a web developer can be as challenging as working out every day.成为网络开发人员就像每天锻炼一样具有挑战性。 It’s important to know what it will take to succeed as a web developer.重要的是要知道要成为一名Web开发人员要取得成功。 Here are 6 things…

阿里云OSS上传图片实现流程

前置&#xff0c;在阿里云开通OSS对象储存。然后在下图文件管理配置文件储存目录和图中传输管理配置访问域名。 1.复制 uploadFileUtil 文件夹和 uploadFile.js 文件在 util 文件夹 2.在使用的页面 引入 uploadFile 效果图&#xff1a; 实现代码 <template><view c…

修改远程桌面连接3389端口号

修改注册表&#xff1a; HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Terminal Server\Wds\Repwd\Tds\Tcp 键&#xff1a;PortNumber&#xff0c;以十进制显示&#xff1a;3389&#xff0c;修改成55555&#xff0c;保存刷新注册表。 HKEY_LOCAL_MACHINE\SYSTEM\Curre…

理解 : UDID、UUID、IDFA、IDFV

iOS获取设备唯一标识的各种方法&#xff1f;IDFA、IDFV、UDID分别是什么含义&#xff1f;iOS获取设备ID总结IDFA解释 关于UUID的理解 : 英文名称是&#xff1a;Universally Unique Identifier,翻译过来就是通用唯一标识符。 UUID是指在一台机器上生成的数字&#xff0c;它保证对…

推箱子2-向右推!_保持冷静,砍箱子-me脚

推箱子2-向右推!Hack The Box (HTB) is an online platform allowing you to test your penetration testing skills. It contains several challenges that are constantly updated. Some of them simulating real world scenarios and some of them leaning more towards a C…

H5面试题---介绍js的基本数据类型

js的基本数据类型 Undefined、Null、Boolean、Number、String 转载于:https://www.cnblogs.com/songchunmin/p/7789582.html

Node.js express 之mongoose 从异步回调函数返回值,类似于同步

http://my.oschina.net/antianlu/blog/187023转载于:https://www.cnblogs.com/cylblogs/p/5192314.html

小程序登录、用户信息相关接口调整说明

为&#xfeff;优化用户的使用体验&#xff0c;平台将进行以下调整&#xff1a; 2021年2月23日起&#xff0c;若小程序已在微信开放平台进行绑定&#xff0c;则通过wx.login接口获取的登录凭证可直接换取unionID2021年4月13日后发布的小程序新版本&#xff0c;无法通过wx.getU…

小程序 reduce_使用Reduce制作的10个JavaScript实用程序功能

小程序 reduceThe multi-tool strikes again. 多功能工具再次触击。 In my last article I offered you a challenge to recreate well-known functions using reduce. This article will show you how some of them can be implemented, along with some extras! 在上一篇文章…

流媒体,hls

所谓流媒体是指采用流式传输的方式在Internet播放的媒体格式。流媒体又叫流式媒体&#xff0c;它是指商家用一个视频传送服务器把节目当成数据包发出&#xff0c;传送到网络上。用户通过解压设备对这些数据进行解压后&#xff0c;节目就会像发送前那样显示出来。流媒体&#xf…

uniapp实现页面左右滑动,上下滑动事件

实现代码&#xff1a; <view class"" touchstart"touchstart" touchend"touchend"> </view> data() {return {touchData: {}, //滑动事件数据} } methods: {touchstart(e) {this.touchData.clientX e.changedTouches[0].clientX;…

android逆向分析概述_Android存储概述

android逆向分析概述Storage is this thing we are all aware of, but always take for granted. Not long ago, every leap in storage capacity was incremental and appeared to be impossible. Nowadays, we don’t give a second thought when contemplating how much of …

小程序地图的使用笔记

这两天在看小程序的地图&#xff0c;写写笔记记录一下 小程序官方文档提供的方法 https://mp.weixin.qq.com/debug/wxadoc/dev/api/location.html 腾讯地图提供的jssdk http://lbs.qq.com/qqmap_wx_jssdk/qqmapwx.html 根据提示使用腾讯地图jssdk需要申请&#xff0c;在实例化的…

JS 实现可停顿的垂直滚动

1 var ScrollMiddle {2 Odiv:document.getElementById(comment), // 目标DOM 3 Oli: document.getElementById(comment).getElementsByTagName(li), 4 times:30, // 配置滚动时间 …

uniapp 上拉加载更多完整实现源码

直接上代码 <template><view class"searchList"><!-- 搜索框 --><Search></Search><img class"top_img" src"/static/image/dataDelivery.png" /><view class"menus p_r"><view class&…

todoist 无法登陆_通过构建Todoist克隆将您的React技能提升到一个新的水平

todoist 无法登陆In this intermediate React course from Karl Hadwen, you will learn how to create the popular Todoist application from scratch using React, Custom Hooks, Firebase & the React Testing Library. You will lean how to use SCSS to style the ap…

w3cscholl的在线代码编辑工具

https://www.w3cschool.cn/tryrun/runcode?langc转载于:https://www.cnblogs.com/jhj117/p/7804133.html

点击事件加锁封装

看代码 // 提交答案 btnReply() {if (!this.$clickLock) returnthis.changeClickLock() } 封装代码 // 点击事件加锁 使用方式&#xff0c;在点击时加入以下代码// if (!this.$clickLock) return// this.changeClickLock()that.changeClickLock () > {that.$clickLock f…

WinCE 7 Mouse HOOK

WinCE 5.0&6.0 的鼠标 HOOK&#xff0c;偶在本博客中已经写过文章。WinCE7.0 的下的鼠标 HOOK 实现&#xff0c;完全和 WinCE 6 是一样的。 效果&#xff1a;在 WinCE 系统界面可以 HOOK 住鼠标的操作。 但是在 Silverlight 应用的界面&#xff0c;HOOK 功能失效。转载于:h…

devops和docker_通过免费的2小时Docker课程学习DevOps基础知识

devops和dockerDocker is a powerful DevOps tool for putting your apps into "containers." Docker是功能强大的DevOps工具&#xff0c;可将您的应用程序放入“容器”中。 You can run these same containers anywhere - on your laptop, on a server - even on a…

生成24位字符串ID__IdGenerator.java

此工具类用于生成24位字符串ID&#xff0c;唯一不重复。 直接通过 IdGenerator.get() 获取。 源码如下&#xff1a;(点击下载源码 - IdGenerator.java ) 1 import java.net.NetworkInterface;2 import java.nio.ByteBuffer;3 import java.nio.ByteOrder;4 import java.util.Enu…