C++ 中文周刊 第116期

周刊项目地址

公众号

RSS https://github.com/wanghenshui/cppweeklynews/releases.atom

欢迎投稿,推荐或自荐文章/软件/资源等

提交 issue

感谢不语 chenbh 赞助

上周团建耽搁。


资讯

标准委员会动态/ide/编译器信息放在这里

编译器信息最新动态推荐关注hellogcc公众号 本周更新 2023-05-31 第204期

ACCU会议开始,后续会把有意思的看一下

文章

#include <array>

template<auto N> constexpr auto foo() { return N; }

template<auto N = 42>
constexpr auto dispatch(auto n) -> int{
    using foo_return_type = std::invoke_result<decltype(&foo<0>)>::type;
    const auto jump_table = []<auto ...I>(std::index_sequence<I...>){
        return std::array<foo_return_type, sizeof...(I)>{
            (foo<I>())...
        };
    }(std::make_index_sequence<N>{});
    return jump_table[n];
};

static_assert(1 == dispatch(1));
static_assert(7 == dispatch(7));
static_assert(23 == dispatch(23));

感觉没啥用

想一个函数处理所有容器类,比如vector

template<typename...Args>
void accept_any_vector(std::vector<Args...> v) {
    using vector = std::vector<Args...>;
    using Value = typename vector::value_type;
    using Allocator = typename vector::allocator_type;

    ...
}

没啥用

只有完美转发才用std::forward

直接看代码吧,optional的辅助函数,c++23可用,说了很多次了,早就该加了

auto p = make_pizza(pizza_size::regular)
   .or_else([]() -> std::optional<pizza> {
      std::cout << "Failed to create pizza\n"; 
      return std::nullopt; })
   .and_then(add_pepperoni)
   .or_else([]() -> std::optional<pizza> {
      std::cout << "Failed to add pepperoni\n"; 
      return std::nullopt; })
   .and_then(add_basil)
   .or_else([]() -> std::optional<pizza> {
      std::cout << "Failed to add basil\n"; 
      return std::nullopt; })
   .and_then(add_artichokes)
   .or_else([]() -> std::optional<pizza> {
      std::cout << "Failed to add pepperoni\n"; 
      return std::nullopt; })
   .transform(get_price);

优化bloom filter提升性能,代码在这里https://github.com/FastFilter/fastfilter_cpp

原理我没有看懂,这里标记一个TODO

Raymond Chen讲的这种需求我没有看懂

看不懂了

std::exchange std::apply也noexcept了。没啥说的

视频

array 无法move,可以掏空容器内的成员

最近看了cppcon 2022的lighting talk,有几个挺有意思。想看的可以b站搜一下。

或者复制这个链接 https://www.bilibili.com/video/BV17X4y117Hx

或者看油管 https://www.youtube.com/playlist?list=PLHTh1InhhwT6U_8ehqxpB7-O1KF_5WwC4

下面是总结,链接用的油管的

他这个点子有意思,是利用clangd 分析可以move的代码,集成到CI。没开源

这个是拉人做开源项目 地址https://github.com/SFML/SFML

这个是要求debug版本性能别太差 move forward addressof 在debug版本下根本没生效,没发挥作用。只能自己hook。目前编译器也在演化这里

使用前要测量一下,或者对业务熟悉,知道这里满足用unlikely。甚至PGO都不能保证?

压测发现直接调用rdtsc和调用系统的clock_gettime没差多少。实际上系统clock_gettime已经用rdtsc实现了。需要确认一下系统时钟源看一下是不是tsc。一些旧博客需要更新了

reveal.js PPT 直接调用godbolt 创意挺有趣

介绍的有点粗糙 std::start_lifitime_as

炫技,代码在这里 https://github.com/boost-ext/mp

开源项目需要人手


本文永久链接

如果有疑问评论最好在上面链接到评论区里评论,这样方便搜索,微信公众号有点封闭/知乎吞评论

看到这里或许你有建议或者疑问或者指出错误,请留言评论! 多谢! 你的评论非常重要!也可以帮忙点赞收藏转发!多谢支持! 觉得写的不错那就给点吧, 在线乞讨 微信转账