C++ 中文周刊 第45期

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

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

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


资讯

标准委员会动态/一些比较出名的项目release/ide/编译器信息放在这里

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

文章

介绍了2023的各种提案亮点

之前也说过,比如Deducing this,比如多维数组 operator , auto代替decay_copy ,123uz后缀 stack_trace库,加强的optional,move_only_function(function_ref), string的细致支持 resize_and_overwrite

来段python解释下

 parser.add_argument(
        '-f', metavar='FILE', type=argparse.FileType('r'), default=sys.stdin,
        dest='file', help='path to file containing the csv benchmark data')

这种字段名=值的用法,怎么在c++中实现?

猥琐方法,c

struct Named 
{ 
  int size; int defaultValue; bool forced; bool verbose; 
  Named() : size(0), defaultValue(0), forced(false), verbose(false) {};
};
 
void foo(Named);
 
void bar()
{
  foo({ .size = 44, .forced = true});
}

但是我们想要这样

void bar()
{
  foo(size: 44, forced: true);
}

只能说,有提案了 D2288R0 Proposal of Designated Arguments DRAFT 2 如果能用上确实挺爽的,尤其是构造函数,语意更清晰

这种指定也能解决构造函数默认参数的顺序引入的问题,比如f(int a=1,b=1,c=1,d=1,e=1), 我想指定b/d这两个值,当前只能把前面的ac都补上,这就非常难受

​ 讲了c++函数近年来的变化,比如各种关键字修饰

template <typename T>
T add(T a, T b)
{
    return a + b;
}
template <>
int add<int>(int a, int b) = delete;
int main()
{
    add(1, 2); // error, this specialization is deleted
}

返回值推导

template <typename T, typename U>
auto add(T a, U b)
{
   return a + b;
}

以及最新的consteval,concept限制等等

auto add(std::integral auto a, std::integral auto b)
{
   return a + b;
}

甚至虚函数也能consteval

struct magic
{
    constexpr virtual int def() const { return 0; }
};
struct programming_magic : public magic
{
    constexpr int def() const override { return 42; }
};
constexpr int initval(magic const & m)
{
    return m.def() + 1;
}
int main()
{
   constexpr programming_magic pm;
   int arr[initval(pm)] = {0};
}

以及最新的协程

#include <cppcoro/task.hpp>

cppcoro::task<> consume_items(int const n)
{
  int i = 1;
  for(auto const& s : produce_items())
  {
     print_time();
     std::cout << "consumed " << s << '\n';
     if (++i > n) break;
  }

  co_return;
}

这俩我愣没看明白到底啥bug

32位时间戳现在已经不可用了

December 31, 2021 at 23:59 表示成 2112312359. 32位最大是 2147483647)

January 1, 2022 at 00:00, 表示成 220101000 已经溢出了

TODO:看不懂兄弟们

视频

可能有第三方实现的冲突。所以别打开命名空间

项目

又一个linq库,作者认为range还是很难用

几个使用例子

std::vector<int> input1 = {1337, 42, 128};
std::vector<std::string> input2 = {"1337", "42", "128"};
std::unordered_map<int, std::string> output = CXXIter::from(input1)
	.copied()
	.zip(CXXIter::from(input2).copied())
	.collect<std::unordered_map>();
// output == { {1337, "1337"}, {42, "42"}, {128, "128"} }
   constexpr cbi::Bounded<int32_t, 1, 10> fst{ 2 };
   constexpr cbi::Bounded<int32_t, 1, 6> sec{ 2 };
   auto res = fst + sec;

   // Bounds are calculated automatically based on the operation
   using expected_t = cbi::Bounded<int32_t, 2, 16>;
   static_assert(std::same_as<expected_t, decltype(res)>);

   assert(res.get() == 4); // extract runtime value

   const std::optional shrinked = res.shrink_bounds<1, 5>(); // shrink bounds
   assert(shrinked.has_value());

不过真的有人用的到吗

工作招聘

这个是之前发过的招聘信息,再挂一周

我们是 TiDBTiFlash 的 compute engine team,包含了基于 Go 的 OLTP 执行引擎与基于 C++ 的 MPP 执行引擎,感兴趣的同学请私信联系(成员分布在上海、广州、杭州、北京、深圳)。(全日制实习生可能得晚点才有 HC)

这里是jd:

看着挺有意思,感兴趣的可以看看

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

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

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


本文永久链接

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