从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;
没啥说的,说了很多次了