技术开发 频道

C++的未来之路:C++0x概览

总结

  将一个数组中所有的形状绘制出来是面向对象编程中一个经典的例子(回想早期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设计的目标便是更好地支持这样的简单方案。

 

0
相关文章