layout | title |
---|---|
post |
第39期 |
从reddit/hackernews/lobsters/meetingcpp摘抄一些c++动态
欢迎投稿,推荐或自荐文章/软件/资源等,请提交 issue
本周内容不多
编译器信息最新动态推荐关注hellogcc公众号 本周更新 Weekly 2021-11-24 第125期
这个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
- Oof (omnipotent output friend) 一个终端图形库
- shadesmar Fast C++ IPC using shared memory 也可以用这个
- cmake-init 一个最小化cmake模版
- 给crc库加上github CI stbrumme/crc32#11
- cutlass CUDA矩阵计算库
偶尔看见的招聘信息会放到这里
昆仑数据库,魔改mysql的,还支持远程工作,友情推荐一波
现在mysql的代码已经很现代c++了
开发深度学习编译器,而且他们也支持远程工作,c++的,友情推荐一波