linux中stl模版的用法1

简介: /* 模版成员模版 */#includeusing namespace std;templateclass Value{ public: Value(const V& v):m_v(v){} V m_v;};templ...
/*
 模版成员模版
 */
#include<iostream>
using namespace std;
template<typename V>
class Value
{
	public:
		Value(const V& v):m_v(v){}
		V m_v;
};
template<typename K>
class Key
{
public:
	Key(const K& k):m_k(k){}
	K m_k;
	template<typename V>
	class Value
	{
		public:
			Value(const V& v):m_v(v){}
			V m_v;
	};
	
};
int main()
{
	Key<string> key("pi");
	Key<string>::Value<double> value(3.1415);
	cout<<key.m_k<<"  "<<value.m_v<<endl;
	return 0;
}



/*
 模版型成员变量
 */
#include<iostream>
using namespace std;
template<typename V>
class Value
{
    public:
        Value(const V& v):m_v(v){}
        V m_v;
};
template<typename K,typename V>
class Pair
{
public:
    Pair(const K& k,const V& v):m_k(k),m_v(v){}
    K m_k;
    Value<V> m_v;
};
int main()
{
    Pair<string,double> pair("PI",3.14);
    cout<<pair.m_v.m_v<<"  "<<pair.m_k<<endl;
    return 0;
}

#include<iostream>
#include<cstring>
using namespace std;
//模板函数
template<typename T>
T max(T x,T y)
{
	return x>y?x:y;
}
//函数特化
template<>
const char* max(const char * x,const char * y)
{
	return strcmp(x,y)>0?x:y;
}
//通用模版类
template<typename T>
class Comp
{
public:
	Comp(T x,T y):m_x(x),m_y(y){}
	T min()const
	{
		return m_x<m_y?m_x:m_y;
	}
	T max() const
	{
		return m_x>m_y?m_x:m_y;
	}
private:
	T m_x;
	T m_y;
};
/*
//全类特化某种类型
template<>
class Comp<const char*>
{
public:
	Comp(const char* x,const char * y):m_x(x),m_y(y){}
	const char* min() const
	{
		return strcmp(m_x,m_y)<0?m_x:m_y;
	}
	const char * max() const
	{
		return strcmp(m_x,m_y)>0?m_x:m_y;
	}
private:
	const char* m_x;
	const char * m_y;
};
*/
//只特化成员函数
template<>
const char* Comp<const char *>::min() const
{
	return strcmp(m_x,m_y)<0?m_x:m_y;
}
//只特化成员函数
template<>
const char * Comp<const char *>::max() const
{
	return strcmp(m_x,m_y)>0?m_x:m_y;
}

int main()
{
	cout<<::max<int>(45,33)<<endl;
	cout<<::max<string>("hello","world")<<endl;
	Comp<int> c1(34,20);
	cout<<c1.min()<<endl;
	Comp<const char *> c2("good","abc");
	cout<<c2.min()<<endl;
	return 0;
}

/*
 模版实现输出流控制
 */
#include<iostream>
#include<sstream>
using namespace std;
template<typename T>
class omanip
{
public:
	omanip(ostream&(*fun)(ostream&,T),T arg):
			m_fun(fun),m_arg(arg){}
	friend ostream& operator<<(ostream& os,
					const omanip<T>& om)
	{
		return om.m_fun(os,om.m_arg);
	}
private:
	ostream& (*m_fun)(ostream&,T);
	T m_arg;
};
class color
{

public:
	color(int ctrl,int bg,int fg):m_ctrl(ctrl)
								  ,m_bg(bg),m_fg(fg){}
	int m_ctrl;
	int m_bg;
	int m_fg;
};
ostream& colorfun(ostream& os,color args)
{
	if(args.m_ctrl==-1) return os<<"\033[0m";
	ostringstream oss;
	oss<<"\033["<<args.m_ctrl<<";"
				<<args.m_bg<<";"
				<<args.m_fg<<"m";
	return os<<oss.str();
}

omanip<color> colorfun1(int ctrl=-1,int bg=-1,int fg=-1)
{
	return omanip<color>(colorfun,color(ctrl,bg,fg));
}
int main()
{
	cout<<colorfun1(1,44,33)<<"test color!"
		<<endl;
	cout<<colorfun1(-1,44,33)<<"test color!"
		<<endl;
	return 0;
}


#include<iostream>
using namespace std;
//智能指针模版类
template<typename T>
class smartptr
{
public:
	explicit smartptr(T* p=NULL):m_p(p){}
	smartptr(smartptr<T>& that):m_p(that.release()){}
	smartptr& operator=(smartptr<T> & that)
	{
		if(&that!=this)
		{
			reset(that.release());
			return *this;
		}
	}
	T& operator*() const
	{
		return *m_p;
	}
	T* operator->() const
	{
		return &**this;
	}
	~smartptr()
	{
		if(m_p)
		{
			delete m_p;
			m_p=NULL;
		}
	}
private:
	T* release()
	{
		T* p=m_p;
		m_p=NULL;
		return p;
	}
	void reset(T* p)
	{
		if(p!=m_p)
		{
			delete m_p;
			m_p=p;
		}
	}
	T* m_p;
};
//智能指错模版类,针对数组的特化
template<typename T>
class smartptr<T[]>
{
public:
	explicit smartptr(T* p=NULL):m_p(p){}
	smartptr(smartptr<T>& that):m_p(that.release()){}
	smartptr& operator=(smartptr<T> & that)
	{
		if(&that!=this)
		{
			reset(that.release());
			return *this;
		}
	}
	T& operator*() const
	{
		return *m_p;
	}
	T* operator->() const
	{
		return &**this;
	}
	~smartptr()
	{
		if(m_p)
		{
			delete[] m_p;
			m_p=NULL;
		}
	}
private:
	T* release()
	{
		T* p=m_p;
		m_p=NULL;
		return p;
	}
	void reset(T* p)
	{
		if(p!=m_p)
		{
			delete[] m_p;
			m_p=p;
		}
	}
	T* m_p;
};
class stu
{
public:
	stu(int id=0,const char * name=""):id(id),name(name){
	 cout<<"stu()\n";
	}
	~stu()
	{
		cout<<"~stu()\n";
	}
	void who() const
	{
		cout<<"id:"<<id<<",name:"<<name<<endl;
	}
private:
	string name;
	int id;
};
int main()
{
	smartptr<stu> ps(new stu(1,"zhansan"));
	ps->who();
	smartptr<stu[]> pss(new stu[5]);
	return 0;
}


相关文章
|
1月前
|
安全 Linux 网络安全
Linux使用HTTP隧道代理代码示例模版
Linux使用HTTP隧道代理代码示例模版
25 0
|
1月前
|
Linux C++
百度搜索:蓝易云【Linux下C++ STL获取Mac地址教程】
请注意,获取MAC地址需要root权限,因此在运行代码时可能需要使用sudo权限。另外,不同的Linux发行版和内核版本可能会稍有差异,您可能需要根据您的具体环境进行适当的调整。
55 0
|
1月前
|
缓存 Ubuntu 网络协议
Linux系统编程之文件I/O函数的使用:介绍文件I/O函数的基本概念、用法和实现方式
Linux系统编程之文件I/O函数的使用:介绍文件I/O函数的基本概念、用法和实现方式
47 1
|
7天前
|
XML Linux API
探索Linux中的dbus-binding-tool:理解其用途与用法
`dbus-binding-tool`是Linux D-Bus工具集的一部分,用于从XML接口描述生成语言绑定代码,简化D-Bus服务在应用程序中的集成。它支持自动代码生成,多种语言(如C、C++、Python),并提供灵活性以适应特定需求。使用步骤包括获取XML描述文件,运行工具生成代码,然后在应用中使用生成的API。注意版本兼容性、错误处理,并参考官方文档和示例以优化使用。该工具助力开发人员高效实现进程间通信和系统服务集成。
|
24天前
|
设计模式 安全 Java
【Linux 系统】多线程(生产者消费者模型、线程池、STL+智能指针与线程安全、读者写者问题)-- 详解
【Linux 系统】多线程(生产者消费者模型、线程池、STL+智能指针与线程安全、读者写者问题)-- 详解
|
1月前
|
监控 Linux
Linux的epoll用法与数据结构data、event
Linux的epoll用法与数据结构data、event
22 0
|
1月前
|
监控 Linux 数据处理
|
1月前
|
Linux 程序员 Shell
【Linux】详解core dump文件的作用以及用法&&ubuntu20.04下无法形成core dump文件的解决办法
【Linux】详解core dump文件的作用以及用法&&ubuntu20.04下无法形成core dump文件的解决办法
|
1月前
|
安全 网络协议 Linux
【专栏】Linux系统中ping命令的使用,包括其基本语法、输出信息、常用参数及高级用法
【4月更文挑战第28天】本文详细介绍了Linux系统中ping命令的使用,包括其基本语法、输出信息、常用参数及高级用法。通过ping,用户可测试网络连通性、诊断故障及评估性能。此外,文章还讨论了ping在不同协议、模拟网络环境及与其他命令结合使用时的场景。注意防火墙和网络环境可能影响ping结果,理解错误信息有助于网络问题排查。熟练掌握ping命令,能助你成为Linux网络专家。不断学习和实践,提升网络技能,为构建稳定网络环境贡献力量。
|
1月前
|
Linux
【专栏】Linux系统中"cd"命令的使用技巧,包括基本用法
【4月更文挑战第28天】本文介绍了Linux系统中"cd"命令的使用技巧,包括基本用法(如切换到指定目录)、利用"."和".."、"~"符号,以及绝对路径和相对路径切换。还分享了高级技巧,如使用通配符、结合其他命令和在脚本中的应用。通过学习这些技巧,可提升工作效率,如快速切换到项目目录或最近使用的目录。