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;
}


相关文章
|
4天前
|
Shell Linux
【linux】Shell脚本中basename和dirname的详细用法教程
本文详细介绍了Linux Shell脚本中 `basename`和 `dirname`命令的用法,包括去除路径信息、去除后缀、批量处理文件名和路径等。同时,通过文件备份和日志文件分离的实践应用,展示了这两个命令在实际脚本中的应用场景。希望本文能帮助您更好地理解和应用 `basename`和 `dirname`命令,提高Shell脚本编写的效率和灵活性。
57 32
|
9月前
|
缓存 Ubuntu 网络协议
Linux系统编程之文件I/O函数的使用:介绍文件I/O函数的基本概念、用法和实现方式
Linux系统编程之文件I/O函数的使用:介绍文件I/O函数的基本概念、用法和实现方式
141 1
|
3月前
|
安全 网络协议 Linux
本文详细介绍了 Linux 系统中 ping 命令的使用方法和技巧,涵盖基本用法、高级用法、实际应用案例及注意事项。
本文详细介绍了 Linux 系统中 ping 命令的使用方法和技巧,涵盖基本用法、高级用法、实际应用案例及注意事项。通过掌握 ping 命令,读者可以轻松测试网络连通性、诊断网络问题并提升网络管理能力。
263 3
|
4月前
|
Ubuntu Linux
Linux的基础用法
Linux的基础用法
34 6
|
5月前
|
监控 Linux
Linux系统中du命令与df命令的区别与用法
总的来说,`du` 和 `df` 在磁盘管理中互补使用,能够提供全面的磁盘空间使用信息,帮助用户和管理员有效地监控和管理系统资源。
144 3
|
5月前
|
存储 Ubuntu Linux
linux中的find 命令详细用法
本文介绍了如何将 `find` 命令与 `exec` 结合使用,通过具体示例展示了多种应用场景,如显示文件属性、重命名文件、收集文件大小、删除特定文件、执行工具、更改文件所有权和权限、收集 MD5 值等。文章还探讨了 `{} \;` 和 `{} +` 的区别,并演示了如何结合 `grep` 命令进行内容搜索。最后,介绍了如何在一个 `find` 命令中使用多个 `exec` 命令。这为 Linux 用户提供了强大的文件管理和自动化工具。
|
6月前
|
存储 运维 监控
运维.Linux下执行定时任务(上:Cron简介与用法解析)
运维.Linux下执行定时任务(上:Cron简介与用法解析)
79 0
|
7月前
|
JavaScript Linux
【详细讲解】Linux grep命令用法大全 片尾有示例搜索指定目录中指定文件后缀的指定字符
【详细讲解】Linux grep命令用法大全 片尾有示例搜索指定目录中指定文件后缀的指定字符
213 1
|
9月前
|
监控 Linux 数据处理
|
8月前
|
XML Linux API
探索Linux中的dbus-binding-tool:理解其用途与用法
`dbus-binding-tool`是Linux D-Bus工具集的一部分,用于从XML接口描述生成语言绑定代码,简化D-Bus服务在应用程序中的集成。它支持自动代码生成,多种语言(如C、C++、Python),并提供灵活性以适应特定需求。使用步骤包括获取XML描述文件,运行工具生成代码,然后在应用中使用生成的API。注意版本兼容性、错误处理,并参考官方文档和示例以优化使用。该工具助力开发人员高效实现进程间通信和系统服务集成。