免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: reiase
打印 上一主题 下一主题

现在觉得算法代码很难写 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2012-04-17 23:05 |只看该作者
回复 10# 家住马戏团

动态需要虚函数,静态还是要拷贝代码,改一下模版参数,跟该一下函数名,差不太多。

不过长确实见识了

论坛徽章:
0
12 [报告]
发表于 2012-04-17 23:06 |只看该作者
reiase 发表于 2012-04-17 23:05
回复 10# 家住马戏团

动态需要虚函数,静态还是要拷贝代码,改一下模版参数,跟该一下函数名,差不太多 ...

是的 只是统一了一下而已,不过我喜欢这种方式

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
13 [报告]
发表于 2012-04-17 23:18 |只看该作者
回复 10# 家住马戏团

动态也应该是:

  1. class A {
  2.       virtual void future() = 0;
  3. public:
  4.       void f() {
  5.             block A;
  6.             future();
  7.       }
  8. };

  9. class A0 : public A {
  10.       void future() {
  11.             block B
  12.             call C
  13.       }
  14. };

  15. class A1 : public A {
  16.       void future() {
  17.             block D
  18.             call E
  19.       }
  20. };
复制代码
才对吧,不过肯定达不到效率要求。


静态就更奇怪了。
完全可以直译为:

  1. template<int future>
  2. void f()
  3. {
  4.       block A
  5.       switch (future) {
  6.       case 0 :
  7.             block B
  8.             call C
  9.             break;
  10.       case 1 :
  11.             block D
  12.             call E
  13.             break;
  14.       }
  15. }
复制代码
然后f<0>或者f<1>。

论坛徽章:
0
14 [报告]
发表于 2012-04-17 23:37 |只看该作者
OwnWaterloo 发表于 2012-04-17 23:18
回复 10# 家住马戏团

动态也应该是:才对吧,不过肯定达不到效率要求。

动态:你多个函数,我用的是装饰模式

静态:我更容易扩展,我用的是静态多态,你只是用模板参数简单传个值

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
15 [报告]
发表于 2012-04-17 23:58 |只看该作者
回复 14# 家住马戏团

>> 动态:你多个函数,我用的是装饰模式

别跟我说什么模式不模式的,我还是用的template method呢。

我只问你:
1. 如果忘记base :: decode 该怎么办?
2. 既然base :: decode 是所有流程都必须的,那template method更适合。
3. 你这个不叫decorator。



>> 静态:我更容易扩展,我用的是静态多态,你只是用模板参数简单传个值

也别跟我扯什么静态多不多态。

1. 你难道就不是模板参数简单传个值?
除了 Decode<这里简单传个值> :: proc 你还能做别的?
除了一个static member function, proc, 整个Decode<这里简单传个值> 类型还能有什么用?


2. 你的扩展性体现在哪里?
体现在可以给Decode再增加其他proc2, proc3么?  对不起,我想这不是lz的需求。
体现在增加更多的algorithm而不需要改写现有代码? 如果有这个需求,同样不需要class/struct。 演示在下面。


3. 重复代码问题怎么说?
block A已经出现了2次,当你所谓的扩展发生时, 还得重复多少次?


最后, 我在13楼给出的只是为了直译楼主8楼的代码。
如果那个switch碍眼, 添加新的algorithm会改动这个switch,如果这样的需求确实存在同样不需要class/struct

  1. template<int N>
  2. void f()
  3. {
  4.       block A
  5.       future<N>();
  6. }

  7. template<int N>
  8. void future();

  9. template<> void future<0>() {
  10.       block B
  11.       call C
  12. }

  13. template<> void future<1>() {
  14.       block D
  15.       call E
  16. }
复制代码
楼主有没有这样的需求还是未知数。
即使有,也不需要class。 class 是虚函数式的多态附带的, 它与继承紧密结合, 继承又与class紧密结合。
但class不是静态多态所必需的, 照着模仿就不对了。

论坛徽章:
0
16 [报告]
发表于 2012-04-17 23:59 |只看该作者
OwnWaterloo 发表于 2012-04-17 23:18
回复 10# 家住马戏团

动态也应该是:才对吧,不过肯定达不到效率要求。

况且你静态写错了。
至少也是f<0>(),f<1>()
如果是在模板里 还要加上template f<0>()以免<被决议称小于号。

论坛徽章:
0
17 [报告]
发表于 2012-04-18 00:00 |只看该作者
OwnWaterloo 发表于 2012-04-17 23:58
回复 14# 家住马戏团

>> 动态:你多个函数,我用的是装饰模式

你要吵架?

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
18 [报告]
发表于 2012-04-18 00:09 |只看该作者
回复 16# 家住马戏团

>> 况且你静态写错了。
>> 至少也是f<0>(),f<1>()

什么叫写错了?
你不是已经明白了f<0>, f<1> 是两个函数, 而f<0>(), f<1>()才是调用, 需要我特别说明吗?


>> 如果是在模板里 还要加上template f<0>()以免<被决议称小于号。

1. 13楼那代码没用上
2. 我见过需要template或者typename 只有 Class :: Member 时才需要
3. 15楼代码,尤其是第5行, 在gcc/msvc/clang下均没有发生你说的情况。

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
19 [报告]
发表于 2012-04-18 00:10 |只看该作者
家住马戏团 发表于 2012-04-18 00:00
你要吵架?


随你喜好。

论坛徽章:
0
20 [报告]
发表于 2012-04-18 00:10 |只看该作者
回复 15# OwnWaterloo


    说说如何不是装饰模式
谈效率,你比我少一次虚函数的访问,多一次正常函数调用,既是有效率差异也只是个指针解引用的问题吧
况且我写我的,你有方法就写你的。
我看到就回复,第一个反应就是这个模式,让我按其他的写,我还可以再用多种模式构造这个模型。我喜欢谈设计模式怎么了?

至于静态,我喜欢谈静态多态怎么了?
为什么每个人留言你都要瞎咋呼几句?
你有不同的理解说你的就是了。我喜欢写奇怪的代码。
我在公司里所有消息内容编解码都是用静态多态写的,为什么不能谈静态多态?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP