c++的模板編程有着神奇的魅力的,在使用的時候絕對不能簡單就理解爲vector<t>這容器模板,而且與java的泛行編程也有很是大的出入。下文以一個簡單的事件監聽爲例子來講沒,在事件驅動的設計中常常有各類各樣的事件以及監聽,好比窗口,鼠標,當事件發起以後將數據封裝到一個特定的event對象中,而後通知監聽器。java
java設計大概以下,只是一個簡要的說明實際上比這個要複雜的多:c++
class Event{編程
String getMessage();windows
}this
class Listener{spa
void notifyEvent(Event e) 設計
}對象
class EventSupport<E extend Event,L extend Listener>{繼承
L listener;事件
void setListener(L l){
this.listener = l;
}
void notify(E e){
l.notifyEvent(e);
}
}
當你在定義一個窗體事件的時候你就須要定義個windowslistener和一個windowsevent,鼠標事件相似,這裏有一個明顯的缺陷耦合,你定義的類必須繼承Listener和Event,換句話說java的泛行編程能力還不夠。接下來看看c++的能力。
template <class Listener ,class Event> class ListenerSupport{ public: void setListener(Listener * listener){ this->listener_=listener; } void notifyEvent(Event event){ listener_->notifyEvent(event); } private: Listener * listener_; }; namespace windows_event{ class WindowsEvent{ public: std::string getMessage(){ return "windowsEvent"; } }; class WindowsListener{ public: void notifyEvent(windows_event::WindowsEvent windowsEvent){ std::cout<<windowsEvent.getMessage()<<std::endl; } }; } namespace mouse_event{ class MouseEvent{ public: std::string getMessage(){ return "MouseEvent"; } }; class MouseListener{ public: void notifyEvent(mouse_event::MouseEvent mouseEvent){ std::cout<<mouseEvent.getMessage()<<std::endl; } }; } int main() { typedef ListenerSupport<windows_event::WindowsListener,windows_event::WindowsEvent> WindowsListenerSupport; typedef ListenerSupport<mouse_event::MouseListener,mouse_event::MouseEvent> MouseListenerSupport; WindowsListenerSupport windowsListenerSupport; windows_event::WindowsListener windowsListener; windowsListenerSupport.setListener(&windowsListener); windowsListenerSupport.notifyEvent( windows_event::WindowsEvent()); MouseListenerSupport mouseListenerSupport; mouse_event::MouseListener mouseListener; mouseListenerSupport.setListener(&mouseListener); mouseListenerSupport.notifyEvent(mouse_event::MouseEvent()); return 0; }
能夠明顯的看到c++的模板編程在泛行編程上作的更完全,直接在類方法上作泛化,在某些時候甚至比繼承以及多態都更增強大。從這個簡單的例子就能體會到模板編程帶來很是多的變化。