總結
“將一個數組中所有的形狀繪制出來”是面向對象編程中一個經典的例子(回想早期Simula的日子)。使用泛型編程,我們可以將其泛化,從而支持繪制任意容器(存儲著Shape指針)中的每個元素。
template<Container C>void draw_all(C& c)
where Usable_as<typename C::value_type,Shape*>
{
for_each(c, mem_fun(&Shape::draw));
}
在C++0x中,我們希望將Container作為一個標準concept,將Usealbe_as作為一個標準判斷式。其中for_each算法已經在C++98中有了,但是接受容器(而非一對迭代器)作為參數的版本要依賴于C++0x中的concept。其中的where子句用于支持算法來表達其對于實參的要求。就這里來說,draw_all()函數(明確)要求容器中的元素必須可以被作為(即可以隱式轉換為)Shape*使用。這里的where子句通過簡單要求一個Shape*容器,為我們提供了某種程度的靈活性和通用性。除了元素為Shape*的任何容器外,我們還可以使用那些元素可以被用作Shape*的任何容器,例如list<shared_ptr<Shape*>>(其中shared_ptr將有可能成為C++0x標準庫中的一個類)、或者元素類型繼承自Shape*的容器,例如deque<Circle*>。
假設我們有p1、p2、p3三個點,我們可以編寫如下代碼來測試draw_all():
vector<Shape*> v = {
new Circle(p1,20),
new Triangle(p1,p2,p3),
new Rectangle(p3,30,20)
};
draw_all(v);
list<shared_ptr<Shape*>> v2 = {
new Circle(p1,20),
new Triangle(p1,p2,p3),
new Rectangle(p3,30,20)
};
draw_all(v2);
“繪制所有形狀”的例子很重要,因為如果你可以很好地實現它,那么你就掌握了大多數面向對象編程中關鍵的東西。通過融合泛型編程(concepts與模板)、常規編程(例如獨立標準庫函數mem_fun())、和簡單數據抽象(mem_fun()函數返回的函數對象),上面的代碼演示了多范型編程的力量。這個簡單的示例為我們開啟了一扇通往許多優雅和高效的編程技巧的大門。
我希望在看完上面的例子之后,你的反應是“如此簡單!”,而不是“如此聰明!如此高級!”在我看來,許多人都在聰明和高級的道路上太過投入。但設計與編程的真正目的是使用最簡單的方案來完成工作,并用盡可能清晰的方式來表達。C++0x設計的目標便是更好地支持這樣的簡單方案。
文章來源于領測軟件測試網 http://www.kjueaiud.com/