c++函数模板与类模板

模板是c++泛型编程的基础,它可以以独立于任何特定类型的方式去编写代码。

目录

一、函数模板

二、类模板


一、函数模板

先来看一个函数模板的定义和使用

template <typename T>
T const add(T const &a,T const &b)
{
	return a + b;
}

int main()
{
	cout << "add(5,6)=" << add(5, 6) << endl;	//输出11

	return 0;
}

声明模板的一般形式template<typename T> ,其中typename可以写完class,当然T也是可以改成其他名字的,这里只是一种习惯的写法。下面的代码和上面的写法实现是一致的。

template <class KO>
KO const add(KO const &a, KO const &b)
{
	return a + b;
}

int main()
{
	cout << "add(5,6)=" << add(5, 6) << endl;	//输出11

	return 0;
}

那么使用函数模板有什么好处呢?

在特定时刻,可以极大的减少我们的代码量,比如以下代码

double add(double a, double b)
{
	cout << "我是double普通方法" << endl;
	return a + b;
}

int add(int a, int b)
{
	cout << "我是int普通方法" << endl;
	return a + b;
}


//函数模板
template <typename T>
T const add(T const &a,T const &b)
{
	cout << "我是函数模板" << endl;
	return a + b;
}

int main()
{
	cout << "add(5,6)=" << add(5, 6) << endl;	//输出11
	cout << "add(5.1, 6.0)=" << add(5.1, 6.0) << endl;	//输出11.1

	return 0;
}

效果:

int add(int a, int b)这个函数,如果需要传入double,我们就需要重载add,再写一个double add(double a, double b)函数。

这样子做会增加代码量,而且也容易出错,不好维护。

这时候可以采用函数模板,只需要写

template <typename T>
T const add(T const &a,T const &b)

即可。

注意:当存在同名的普通函数和函数模板的时候,编译器会优先调用普通函数。所以上面输出的就是

我是double普通方法 以及 我是int普通方法。

二、类模板

简单写一下类模板的实现

在这里,我们定义了一个类模板,然后把对应的视图类存储进map中,方便后期维护。

//类模板
template <typename T>
class ChildView{
public:
	void pushItem(std::string name,T const& Item);
	void removeItem(std::string name);
	void showItems();
	bool isEmpty();
private:
	map<std::string,T> m_viewMap;
};

template<typename T>
void ChildView<T>::pushItem(std::string name, T const& Item)
{
	m_viewMap[name] = Item;
}

template<typename T>
void ChildView<T>::removeItem(std::string name)
{
	auto iter = m_viewMap.begin();
	iter = m_viewMap.find(name);
	if (iter != m_viewMap.end())
	{
		iter = m_viewMap.erase(iter);
	}
}

template<typename T>
void ChildView<T>::showItems()
{
	auto iter = m_viewMap.begin();
	for (; iter != m_viewMap.end(); iter++)
	{
		cout << iter->first.c_str() << "--";
		iter->second->showView();
	}
	cout << endl;
}

template<typename T>
bool ChildView<T>::isEmpty()
{
	if (!m_viewMap.empty())
		return false;
	return true;
}

class IView{
public:
	virtual void showView() = 0;
};

//下载界面
class DownloadView:public IView
{
public:
	void showView()
	{
		cout << "下载界面" << endl;
	}
	//...
};

//关于界面
class AboutView :public IView
{
public:
	void showView()
	{
		cout << "关于界面" << endl;
	}
	//...
};

int main()
{
	ChildView<IView*> view;
	IView* dv = new DownloadView;
	IView* av = new AboutView;
	view.pushItem("download", dv);
	view.pushItem("about", av);

	if (!view.isEmpty())	//如果不为空
	{
		view.showItems();
		cout << "-----------------" << endl;
		view.removeItem("about");
		view.showItems();
	}

	return 0;
}

效果:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值