前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++ 动态新闻推送 第45期

C++ 动态新闻推送 第45期

作者头像
王很水
发布2022-01-19 16:11:53
3580
发布2022-01-19 16:11:53
举报

C++ 动态新闻推送 第45期

文章

介绍了2023的各种提案亮点

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

来段python解释下

代码语言:javascript
复制
 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

代码语言:javascript
复制
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});
}

但是我们想要这样

代码语言:javascript
复制
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++函数近年来的变化,比如各种关键字修饰

代码语言:javascript
复制
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
}

返回值推导

代码语言:javascript
复制
template <typename T, typename U>
auto add(T a, U b)
{
   return a + b;
}

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

代码语言:javascript
复制
auto add(std::integral auto a, std::integral auto b)
{
   return a + b;
}

甚至虚函数也能consteval

代码语言:javascript
复制
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};
}

以及最新的协程

代码语言:javascript
复制
#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:看不懂兄弟们

视频

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

项目

  • asteria 一个脚本语言,可嵌入,长期找人,希望胖友们帮帮忙,也可以加群128705139和作者对线
  • pika 一个nosql 存储, redis over rocksdb,非常需要人贡献代码胖友们, 感兴趣的欢迎加群294254078前来对线
  • Taskflow v3.3 released! 这个库非常牛逼
  • fmt 更新8.1版本,chrone相关打印更快,提升十倍。使用到的朋友们尽可能升级
  • CXXIter: A chainable c++20 LINQ-like iterator library

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

几个使用例子

代码语言:javascript
复制
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"} }
  • fmtlog 一个基于fmt库的log库,极致低延迟速度快,由于设计原因(消费队列),log速度过快会导致log丢失,不过点子还是很有意思的。nanolog之类的想法,但做的更快
  • KDBindings 一个把signal-slot剥离出来成一个组件的库,可以方便桌面编程,尤其是不方便用qt的场景
  • fuss 一个简单的pubsub实现,没啥特别的,就function存调用
  • libsigcplusplus c++17信号处理库 现在不会还有人没用c++17吧
  • compile time bounded integers 编译期计算库
代码语言:javascript
复制
   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());

不过真的有人用的到吗

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • C++ 动态新闻推送 第45期
    • 文章
      • 视频
        • 项目
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档