Skip to content

Latest commit

 

History

History
203 lines (125 loc) · 6.4 KB

039.md

File metadata and controls

203 lines (125 loc) · 6.4 KB
layout title
post
第39期

C++ 中文周刊 第39期

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

周刊项目地址在线地址知乎专栏 |腾讯云+社区

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

本周内容不多


资讯

编译器信息最新动态推荐关注hellogcc公众号 本周更新 Weekly 2021-11-24 第125期

标准委员会邮件,11月

文章

这个time相关的支持,应该就是date库的实现。这个一直在推进标准,不知道进展如何

constexpr auto thanksgiving = November / 25 / 2021y;

static_assert(year(2021) == thanksgiving.year());
static_assert(month(11)  == thanksgiving.month());
static_assert(day(25)    == thanksgiving.day());

能得到比gettimeofday更快的速度,但rdtsc也有代价,这里做个小科普

之前说到,尽量用string_view代替const string_view& 补充一点,在msvc上,没啥差别 msvc的实现的原因

就是c的结构初始化

struct Point { 
    double x { 0.0 };
    double y { 0.0 };
};

const Point p { .x = 10.0, .y = 20.0 };
 
const Point offset { .x { 100.0 }, .y { -100.0 } };

// mix also possible:
const Point translation { .x = 50.0, .y { -40.0 } };

mt19937太慢了,实现了个Xoshiro256ss替代

介绍c++20这些场景如何处理

如何让成员根据条件生成 [[no_unique_address]] + std::conditional_t

如何让成员函数根据条件生成/限制 concept

如何让类中的类型根据条件生成/限制 继承std::conditional_t

就是简单的接口用编译期测试来组合,尽可能constexpr,然后直接static_assert测试

#include <vector>
#include <string_view>
#include <numeric>

// std::isdigit is not constexpr
constexpr bool is_digit(char c)
{
    return c >= '0' && c <= '9';
}

constexpr unsigned int accumulate_string_digits(std::string_view str)
{
    std::vector<unsigned int> digits;
    for (auto c: str)
    {
        if (is_digit(c))
            digits.push_back(c - 48);
    }
    return std::accumulate(digits.begin(), digits.end(), 0);
}
static_assert(accumulate_string_digits("") == 0);
static_assert(accumulate_string_digits("1") == 1);
static_assert(accumulate_string_digits("12345") == 15);
static_assert(accumulate_string_digits("1a23c45c") == 15);
static_assert(accumulate_string_digits("Hello, World!") == 0);

讨论构造函数的异常安全,比如构造出错,解决方案是拆分,把构造函数拆出init,单独执行,但是可能init会漏掉

最后的合适方案是隐藏构造函数,用create来代替构造生成

class Rectangle {
    // ...

    Rectangle(int w, int h) : width(w), height(h), area(w * h) {
        assert(width > 0 && height > 0);
    }

public:
    static std::optional<Rectangle> create(int w, int h) {
        if (w <= 0 || h <= 0) {
            return std::nullopt;
        }
        return Rectangle(w, h);
    }

    // ...
};

视频

介绍一些c++23的小特性

string

  • string支持contains方法
  • string从nullptr构造会直接报错

module 话说module发音是妈桌我一直发音成麻豆

  • 一些速度提升

io支持

  • std::print 干掉iostream,比printf快,三倍cout
  • std::format的一些运行时匹配错误转移到编译期来判定 //这个cppcon 2021也有讲,目前还没放出来

range的一堆fix以及新接口,range更函数式

constexpr 各种 比如unique_ptr cmath接口 optional 等等,内存分配甚至也是可以constexpr的

杂项

  • monadic optional 让optional更好用,and_then之类的小接口
  • std::expected 这个很经典了,就是rocksdb的status类那种形式
  • stacktrace 应该就是boost哪个库
  • byteswap 这个是std::endian之后的引入
  • to_underlying对枚举拿到背后的值,不用cast,标准库工具帮你cast

项目

工作招聘

偶尔看见的招聘信息会放到这里

昆仑数据库,魔改mysql的,还支持远程工作,友情推荐一波

现在mysql的代码已经很现代c++了

开发深度学习编译器,而且他们也支持远程工作,c++的,友情推荐一波


本文永久链接