- 论坛徽章:
- 2
|
本帖最后由 OwnWaterloo 于 2011-10-11 16:28 编辑
比如,createImageByXXX 最终总是这样两步:
1、以XXX方式得到图片数据
2、用图片数据创建图片
这种问题在C里面,可以用链式调用解决:
createImage(loadImage(filename)) //从文件创建
createImage(clipImage(imageBuf, rect)) //从已有图片截取
createImage(xxImage(...)) //以xx方式获得图片数据
狗蛋 发表于 2011-10-11 15:29
"以xxx方式得到图片数据"在C++里面还可以继续重载…… 比如:
createImage(imageDateFrom(filename))
createImage(imageDateFrom(imageBuf, rect))
createImage(imageDateFrom(...))
不是说一定需要这么设计。
但一旦将有类似含义的函数实现为一组重载而非不同名的函数, 再配合函数模板, 立马就威力无穷了。
template<typename It,typename F>
void for_each(It begin, It end, F f)
{
for (; begin!=end; begin=next(begin)) f(elem(begin));
}
这段代码可以用于vector, list, deque, ... 以及任何满足next, elem 含义的序列 —— 实际STL是用 ++ 与 * 而非next/elem 重载
这是 nextOfVector/List/Deque, elemOfVector/List/Deque 不能表达的。
一旦采用 nextOfXXX 抽象就断在这里了。
而 next(XXX ...) 可以配合其他机制使得抽象可以继续。
注意啊…… 不是说一定非得采用这种设计, 一定要将load/clip 抽象为 dataFrom。
只是说, 当确实需要这种抽象(比如iterator)时, 缺乏重载带来的影响是没法消除的。 |
|