- 论坛徽章:
- 2
|
回复 3# starwing83
还是有很多地方不明白。
先说重载。 假设:
- void DO(size_t count, vec2 const vs[], float dists[]) {
- assert(dists);
- // 实际干苦力的代码
- }
- float* DISTS(size_t count, vec2 const vs[]) {
- // 通过count与vs计算dists的代码
- return ...;
- }
复制代码 (BTW: 内存打算怎么释放。。。 比如dists = update_dist(count, vs);里面)
DO,DISTS只是表示这两段计算的代码片段。 为了方便说明而已。 至于它是否应真的应该是一个独立的函数、或者是操作符是另外的事情。
比如:
- void stroke::operator()(size_t count, vec2 const vs[], float dists[] = 0) {
- if (!dists) dists = DISTS(count, vs);
- DO(count, vs, dists);
- // ...
- }
复制代码 的意思是如果打算将功能做成一个调用操作符, 并且dists选择一个默认参数然后在运行时判断就可以这么写。 DISTS和DO可以直接展开到stroke:: operator() 里面而并不出现在其他地方。
如果不支持重载的话:
- void f_with_dists(size_t count, vec2 const vs[], float dists[]) { DO(count, vs, dists); }
- void f_without_dists(size_t count, vec2 const vs[]) { float* dists = DISTS(count, vs); DO(count, vs, dists); /* ... */ }
复制代码 是最清晰的了吧? 为了方便调用、减少暴露接口的数量可能还会:
- void f_maybe_dists(size_t count, vec2 const vs[], float dists[]) { if (!dists) dists = DISTS(count, vs); DO(count, vs, dists); /* ... */ }
复制代码 至于它们究竟应该是什么名字, 究竟要实现/暴露哪些就需要权衡了。。。
而如果支持重载:
- void f(size_t count, vec2 const vs[], float dists[]) { DO(count, vs, dists); }
- void f(size_t count, vec2 const vs[]) { float* dists = DISTS(count, vs); f(count, vs, dists); /* ... */ }
复制代码 而默认参数反而显得很鸡肋:
- void f(size_t count, vec2 const vs[], float dists[] = 0);
复制代码 用户有没有计算好dists在编译时的各个调用点上就区分出来了:
- f(count,vs);
- f(count,vs,dists);
复制代码 除非这种编译时的选择不能继续“扩散”出去。
然后说继承。。。
>> 麻烦的是,只要子类有任何一个函数存在,继承类所有同名不同签名函数都会被隐藏,所以没办法形成重载的效果吧……
嗯。。。 要using。。。
>> 主要目的是想能“自动地”让一系列类带上“自动距离计算”的功能,尽量在子类里面少写重复的参数判断代码……
于是就不明白除了storke之外其他类到底想要做什么。。。 |
|