C++ 中文周刊 第65期

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

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

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

2020 0606上周周五放假就忘记更了


资讯

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

编译器信息最新动态推荐关注hellogcc公众号 本周更新 2022-06-01 第152期

文章

template<class T, std::size_t Size>
struct reserved : T {
  constexpr reserved() {
    T::reserve(Size);
  }
};

int main() {
  std::cout << std::vector<int>{}.capacity();               // prints 0
  std::cout << reserved<std::vector<int>, 42>{}.capacity(); // prints 42
}

看不懂有啥实际用途。。这里体验

介绍这本书的。主要是现代c++背景下的异常安全

又是simd 代码在这里https://github.com/google/highway

不一定++it比it++快。这种事看个人习惯

也介绍很多次了mold连接器非常快

consteval int bar(int i) {
    return 2*i;
}

int foo(int i) {
    if consteval {
        return bar(i);
    }
    return 2*i;
}

int main() {
  [[maybe_unused]] auto a = foo(5);
}

编译期利器

讲v8遇到的指针问题以及引入的解决方案,olipan gc之类的。之前讲过, 代码在这里https://chromium.googlesource.com/v8/v8.git/+/main/include/cppgc

std::vector<int> vec0(5, 9); // 9, 9, 9, 9, 9
std::vector<int> vec1{5, 9}; // 5, 9

这个和上面讨论的差不多。这个新的构造函数引入了更多的歧义

打印枚举几种实现

// 基本
const char *Colour_print(Colour c) {
    switch (c) {
    case Red: return "Red";
    case Green: return "Green";
    case Blue: return "Blue";
    case Orange: return "Orange";
    case White: return "White";
    case Black: return "Black";
    case Pink: return "Pink";
    case Yellow: return "Yellow";
    default: return "Unknown";
    }
}

// X Marco 没省多少
#define COLOURS \
    X(Red)      \
    X(Green)    \
    X(Blue)     \
    X(Orange)   \
    X(White)    \
    X(Black)    \
    X(Pink)     \
    X(Yellow)

#define X(c) c,
typedef enum { COLOURS } Colour;
#undef X

const char *Colour_print(Colour c) {
    switch (c) {
#define X(c) case c: return #c;
        COLOURS;
#undef X
    default: return "Unknown";
    }
}

也可以抽象一下X macro

#define ENUM_PRINTABLE(name, list) \
    typedef enum { list(DEF_ENUM_VARIANT) } name; \
 \
    const char *name##_print(name val) { \
        switch (val) { \
            list(CASE_ENUM_VARIANT) \
        default: return "Unknown"; \
        } \
    }

#define DEF_ENUM_VARIANT(c)  c,
#define CASE_ENUM_VARIANT(c) case c: return #c;


#define COLOURS(f) \
    f(Red)         \
    f(Green)       \
    f(Blue)        \
    f(Orange)      \
    f(White)       \
    f(Black)       \
    f(Pink)        \
    f(Yellow)

ENUM_PRINTABLE(Colour, COLOURS)

或者直接用metalang99. 感觉和boost pp差不多

#include <metalang99.h>

#define ENUM_PRINTABLE(name, ...) \
    typedef enum { __VA_ARGS__ } name; \
 \
    const char *name##_print(name val) { \
        switch (val) { \
            ML99_EVAL(ML99_variadicsForEach(ML99_reify(v(CASE_ENUM_VARIANT)), \
                                            v(__VA_ARGS__))) \
        default: return "Unknown"; \
        } \
    }

#define CASE_ENUM_VARIANT(c) case c: return #c;

视频

没啥说的,说了很多次了

开源项目需要人手

新项目介绍/版本更新

工作招聘


本文永久链接

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