网站首页 文章专栏 通过 odr use 与类型推导逼迫编译器生成代码
通过 odr use 与类型推导逼迫编译器生成代码
编辑时间:2024-12-28 12:43:31 作者:loop 6条评论


    出自:purecpp.cn

    地址: www.purecpp.cn

    转载请注明出处!


来说两句吧
登录才能发表评论。
最新评论
  • qicosmos
    qicosmos 2024-12-29 00:50:14

    我加了一行代码但是编译不过呀:

    template<typename _Type>
    struct odr : public message_base {
        inline static auto use = []{
            std::cout << __PRETTY_FUNCTION__ << std::endl;
            register_create_func(typeid(_Type).name(), [] { return std::make_shared<_Type>(); });
            return 0;
        }();

    };


    加了注册的代码,里面有lambda就编译不过了。

  • qicosmos
    qicosmos 2024-12-29 00:51:45

    编译错误:

    error: invalid use of incomplete type ‘struct message’
    [build]    17 |       typeid(_Type).name(), [] { return std::make_shared<_Type>(); });
  • qicosmos
    qicosmos 2024-12-29 00:59:40
    struct message : crtp<message>{};
  • qicosmos
    loop 2024-12-29 02:49:03

    这个编译错误应该是因为编译器在 phase 1 递归引用 message 的定义。可以用个 adl 把这个代码生成压到编译 phase 2 去,这样应该就能绕过去了。

     https://godbolt.org/z/4ezEovWb9 

    在这个例子里面 delete new 的那个地方注册,那个位置在 phase 2,应该就能看到 message 的定义了。原理类似于 Barton-Nackman trick。

  • qicosmos
    loop 2024-12-29 03:10:59

    https://godbolt.org/z/cf7hrTzcq

    放普通定义里也可以,也是 phase 2 在扫 declare 之后编译的,也可以看到 _Type 的定义

  • qicosmos
    qicosmos 2024-12-29 06:01:21
    不错,crtp加一个辅助函数解决了问题,这应该是目前最完美的一种解法了,实现了真正意义上的自动注册。
Absolutely

purecpp

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


[社区开源项目列表,点击前往]


purecpp社区自2015年创办以来,以“Newer is Better”为理念,相信新技术可以改变世界,一直致力于现代C++研究、应用和技术创新,期望通过现代C++的技术创新来提高企业生产力和效率。


社区坚持只发表原创技术文章,已经累计发表了一千多篇原创C++技术文章;


组织了十几场的C++沙龙和C++大会,有力地促进了国内外C++开发者之间的技术交流;


开源了十几个现代C++项目,被近百家公司所使用,有力地推动了现代C++在企业中的应用。


期待更多的C++爱好者能参与到社区C++社区的建设中来,一起为现代C++开源项目添砖加瓦,一起完善C++基础设施和生态圈。


微信公众号:purecpp, 社区邮箱: purecpp@163.com


友情链接