网站首页 文章专栏 modern c++设计模式系列(一)
modern c++设计模式系列(一)
编辑时间:2019-01-16 21:06:47 作者:qicosmos 6条评论


    出自:purecpp

    地址: www.purecpp.org

    转载请注明出处!


来说两句吧
登录才能发表评论。
最新评论
  • qicosmos
    star 2019-01-17 07:58:18

    p->visit(static_cast<T*>(this)); 是否应该更改为 p->visit(dynamic_cast<T*>(this)); 这里是一个向下转换

    另,个人感觉从类的继承的角度上来说,还是强耦合的关系,不过从利用模板继承功能,实现了更加便利的用户扩展方式。当然这种模板继承也可以认为是一种静态继承关系。不知这种说法对不?
  • qicosmos
    zhangzy 2019-01-19 11:26:42

    第二次改进,


    int test(zoo::animal* anim){
        if(anim->get_type()==zoo::AnimalType::Dog) {
            return anim->move();
    

    }


    这个根据类型,不是访问子类独有的函数吗?这个应该改成这样吧,要不就没意思了

    int test(zoo::animal* anim){
        if(anim->get_type()==zoo::AnimalType::Dog) {
            dynamic_cast<zoo::Dog*>(anim)->swim();
    

    }


  • qicosmos
    qicosmos 2019-01-19 13:54:40
    @star 这里具体类型是确定的,所以可以直接用static_cast而不需要用dynamic_cast了。
  • qicosmos
    qicosmos 2019-01-19 13:56:04

    @zhangzy

    用了get_type就不需要再用dynamic_cast了,直接static_cast就可以了,因为类型是确定的了。

    void test(animal* an) {
    	if (an->get_type() == AnimalType::Dog) {
    		static_cast(an)->swim();
    	}
    }

  • qicosmos
    gigglesun 2019-01-22 16:20:33
    • 最后一次改进中,

      using MyVisitor = MultipleVisitor;
      
      using MyVisitor1 = MultipleVisitor;

      这两行用到的应该是C++11的using语法。没有升级到C++17的也可以用这个设计模式。

      证明:不用Init Statement for if /switch,将crtp改为如下两次dynamic_cast, 在C++11中可以用g++ -std=c++11 -o test test.cpp编译通过最后一次优化后的代码。(PS: 发现写错评论了需要删除才能修改,评论方便支持modify功能吗?)

      //crtp
      template
      struct visitable : public animal {
          void accept(visitor_token* v) {
              if(dynamic_cast* >(v)){
                  auto p = dynamic_cast* >(v);
                  p->visit(static_cast(this));
              }
          }
      

      };

  • qicosmos
    枪骑兵叔叔 2019-02-24 20:51:09

    第二次改进的test()有问题吧,没有else分支。而且if分支里应该调用swim,不应该写move()。else分支调用fly()。

Absolutely

purecpp

一个很酷的modern c++开源社区


这里有创新的idea,这里有最酷的modern c++代码,这里有很棒的modern c++开源项目。purecpp社区邮箱 purecpp@163.com
友情链接