C++ 中文周刊 第16期

reddit/hackernews/lobsters/meetingcpp摘抄一些c++动态。

每周更新

周刊项目地址 github在线地址知乎专栏

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


资讯

编译器信息最新动态推荐关注hellogcc公众号

本周周报github直达

一些软件的更新,clion/qt等等不多说了

最近c++的提案进展

修正if constexpr的bug P1938,比如这段代码 if constexpr (std::is_constant_evaluated())

constexpr size_t strlen(char const* s) {
    if constexpr (std::is_constant_evaluated()) {
        for (const char *p = s; ; ++p) {
            if (*p == '\0') {
                return static_cast<std::size_t>(p - s);
            }
        }    
    } else {
        __asm__("SSE 4.2 insanity");        
    }
}

修复string从nullptr构造的错误 P2166

out_ptr and inout_ptr 帮助指示指针所有权 P1132

加上 ranges::starts_withand ranges::ends_with让string操作更流畅 P1659

让static_assert中的值默认为bool P1401

Today If accepted
if constexpr(bool(flags & Flags::Exec)) if constexpr(flags & Flags::Exec)
if constexpr((flags & Flags::Exec) != 0) if constexpr(flags & Flags::Exec)
static_assert(bool(N)); static_assert(N);
static_assert(N % 4 != 0); static_assert(N % 4);

Concurrency TS:又开始了, P1121 and P1122 hazard pointers read-copy-update (RCU) 这终于要进入大众视野里,好事一件

文章

这篇文章里提到了一个方法,帮助测试代码的

可以使用-fno-access-control 编译你的测试代码,可以使 g++关闭 c++成员的访问控制(即 protected 及 private 不再生效)

从来没注意过,很有意思

如何实现python中的namedtuple?

from collections import namedtuple

nt = namedtuple("price", "size")

nt.price = 42;
nt.size = 100;

assert 42 == nt.price and 100 == nt.size

看起来像map,但是和tuple无缝衔接

最简单的思路就是记住name到index的映射,再从index拿到tuple的元素,也就是map+tuple的组合

比如Poco.NamedTuple.h 这个name是有限的

现在2021了,都是变参模版了,用这个方法也不是不可以,但是从tuple本身的角度来考虑

name 字符串本身可以封装成tuple,一个最简单的一个元素的name tuple也是tuple,所以name tuple就是普通tuple的二倍了

现在的问题是如何get,但是tuple只支持type定位,而name 是字符串,一个tuple有很多string就不能保证唯一性了,所以通过模版封装name成一个新类型,模版,每个类型都不一样,就解决了这个问题,能定位到name_type,当然就能找到下一个元素

类似的实现思路,见这个仓库 https://github.com/erez-strauss/named_tuples

一个windows下动态库加载失败的问题定位

require里混着require,各种编译器行为不一致(没有展示过这个例子之前我没想过可以这么写)

template<class T>
concept HasAButNotB = requires (T t) {
    t.a();
    !requires { t.b(); };
};

struct S1 {};
struct S2 { void a(); };
struct S3 { void b(); };
struct S4 { void a(); void b(); };

static_assert(!HasAButNotB<S1>);  // as expected
static_assert(HasAButNotB<S2>);   // as expected
static_assert(!HasAButNotB<S3>);  // as expected
static_assert(HasAButNotB<S4>);   // ...oops!

简单介绍了浮点型的坑

讨论了几种匹配重载,tag dispatch技巧和enable_if/concept

视频

上一期讨论了某种场景下pair可能还不如普通的struct效果好,这里讲了几个技巧来确认这种问题,通过关键字 平凡构造之类的。tldr: 能用标准库就用,一般不是热点

项目


本文永久链接

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