模板是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;
}
效果: