网站首页 文章专栏 简单点,元编程的方式简单点
简单点,元编程的方式简单点
编辑时间:2024-11-06 15:02:21 作者:TypeCombinator 4条评论


    出自:purecpp.cn

    地址: www.purecpp.cn

    转载请注明出处!


来说两句吧
登录才能发表评论。
最新评论
  • qicosmos
    qicosmos 2024-11-07 12:50:52

    把`static constexpr auto id`加一下inline就行了。

    感觉这个获取类型id的方法有点复杂,可以搞简单点:

    ```

    template <class C>
    struct TypeIdentifier {
    constexpr static int _id{};
    constexpr static auto id() {
    return &_id;
    }
    };

    ``

    这种方法就简单很多。

  • qicosmos
    TypeCombinator 2024-11-08 01:41:54

    [good]没错,这2个改动更简洁。作者在cppcon上的slides的讲解和仓库文档贴的compiler explorer的代码都没用计数器的方式,其实我也有点纳闷。推测有2中可能:

    1.static constexpr变量或函数被取址后,会导致静态内存分配或产生对应的代码段,如果在运行时使用了id,引用这段内存,那么这段内存不能在链接时被GC,导致二进制膨胀;

    2.计数器可以让类型id在有限范围内,某些算法或数据结构在这种情况下更优?比如deduplicate可以轻易稳定地做到O(n)?或者sort可以用基数排序?再或者上线段树(实在想不出应用场景了)?好吧!我编不下去了。。。有点想问问作者了[挖鼻]
  • qicosmos
    loop 2024-11-08 09:28:21

    他那个 invoke 的默认模板参数最后的 []{} 每次实例化都会刷新一个临时类型,他把这个刚生成的临时类型压入 friend injection 序列,把返回值当 size 用。拿到 size 的目的是在 invoke 里用这个 size 展开 index_sequence,来做语义上的显式静态求值到隐式静态求值的 dispatch。这么做是因为 invoke 的 info meta 参数没法被还原到编译期,也就是说没法传给模板参数,所以只能做这个 dispatch 绕过去。如果换成地址,那就取不到这个 size,导致 invoke 里面没法用 index_sequence 展开。

  • qicosmos
    TypeCombinator 2024-11-08 15:14:08
    [good]太棒了,谢谢解惑[嘻嘻]看了下invoke,确实如此!不过,感觉这个invoke实现在每次调用时都会产生大量额外的新类型,类型id怕是会增长飞快。
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


友情链接