公众号
RSS https://github.com/wanghenshui/cppweeklynews/releases.atom
欢迎投稿,推荐或自荐文章/软件/资源等
感谢 振羽
不语
赞助
标准委员会动态/ide/编译器信息放在这里
七月邮件列表
https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2023/#mailing2023-07
编译器信息最新动态推荐关注hellogcc公众号 本周更新 2023-07-26 第212期
有点意思
struct foo {
auto bar(int v) { return v; }
};
static_assert(42 == std::bind_front<&foo::bar>(foo{}, 42));
不懂啥意思
讲浮点数压缩的,没看懂。这里标记个TODO后面研究一下
SIMD时间,这回不贴代码了。https://github.com/lemire/Code-used-on-Daniel-Lemire-s-blog/tree/master/2023/07/27
作者想把
constexpr std::tuple<int, double, int, double, float> { 1, 2.0, 1, 3.0, 2.0 }
变成 constexpr std::tuple<int, double, double, float> { 1, 2.0, 3.0, 2.0 }
简单方案就是boost::mp_list
,或者看这个 https://stackoverflow.com/questions/55941964/how-to-filter-duplicate-types-from-tuple-c
但作者想要的是如果值相等才把类型吃掉,有点点难
直接贴代码吧,我看不懂,作者推导了半天
#include <functional>
#include <tuple>
template<typename T1, typename T2>
consteval bool JMEq(const T1& v1, const T2& v2) {
if constexpr (!std::is_same_v<T1, T2>)
return false;
else
return v1 == v2;
}
template<const auto& F>
constexpr auto Nub() {
constexpr auto tup = F();
constexpr auto indices = std::make_index_sequence<std::tuple_size_v<decltype(tup)>> {};
return [&]<std::size_t... Ix>(std::index_sequence<Ix...>)
{
return std::tuple_cat ([&]
{
constexpr auto index = Ix;
constexpr auto element = std::get<index>(tup);
if constexpr (((JMEq(element, std::get<Ix>(tup)) && Ix < index) || ...))
return std::tuple {};
else
return std::tuple { element };
} ()...);
} (indices);
}
constexpr auto structuralize(auto tuple){
return std::apply([]<typename... Args>(Args... args) { return ST<Args...>(args...); }, tuple);
}
constexpr std::tuple<int, double, int, double, float> input { 1, 2.0, 1, 3.0, 2.0 };
constexpr std::tuple<double, int, double, float> expected { 2.0, 1, 3.0, 2.0 };
constexpr auto actual = Nub<structuralize(input)>();
static_assert(expected == actual);
简单说就是lambda是对象,有时候不捕获的lambda也是对象,和函数指针差不多,太浪费了,于是引入了static lambda,static operator
auto isEven = [](int i) static {return i % 2 == 0;};
如果捕获会报错
// ERROR: 'static' lambda specifier with lambda capture
auto isDivisableBy = [operand](int i) static {return i % operand == 0;};
其实static operator[]原因也差不多。代码就不列举了
forward对于 initializer_list对象行不通,initializer_list真该死啊
template<typename T, typename... Args>
std::unique_ptr<T> make_unique(Args&&... args){
return std::unique_ptr<T>(
new T(std::forward<Args>(args)...));
}
这样就不行
struct Point {
int x, y;
};
struct Segment {
Segment(Point p1, Point p2);
};
void test() {
// This works
Segment s({ 1, 1 }, { 2, 2 });
// This doesn't
auto p = std::make_unique<Segment>(
{ 1, 1 }, { 2, 2 });
}
封装一层吧
struct Segment {
Segment(Point p1, Point p2);
template<typename Arg1 = Point,
typename Arg2 = Point>
static std::unique_ptr<Segment> make_unique(
Arg1&& p1, Arg2&& p2) {
return std::make_unique<Segment>(
std::forward<Arg1>(p1),
std::forward<Arg2>(p2));
}
};
这样就行了
讲winrt的。不说了
本周视频很多 cppnow 2023来了。基本上讲的是今年cppcon的前瞻内容
这个是之前他写的博客,直接做成视频讲了一遍,就是讲用tag dispatch替换switch加速的
ppt在这里 https://github.com/boostcon/cppnow_presentations_2023/blob/main/cppnow_slides/A_Deep_dive_into_dispatching_techniques.pdf
周末有空我就传一下
这个华人哥们讲的也有点意思
介绍numa的,有点意思
敏感字符串过滤?hash绕过
感觉之前说过,还是布局之类的。没有细看
这个教程也不错,手把手带你了解协程以及一个task模型
讲高频交易的,很干货。值得一看
讲基于epoch的内存回收的。epoch推进技术其实已经不是新东西了。到处都可见,或多或少要了解一下。了解背景之后值得看看
如果有疑问评论最好在上面链接到评论区里评论,这样方便搜索,微信公众号有点封闭/知乎吞评论