首页 > 其他分享 >std::quoted试用学习

std::quoted试用学习

时间:2023-06-28 20:13:15浏览次数:49  
标签:std string quoted Quote quotes 试用 out

std::quoted 是干啥用的,有啥作用?
看是c++14和17中加入的。

quoted 这个单词似乎在计算机里面就有着特殊的意思,可惜没记住。英文原版资料看的少。

 

 

在cppreference网站中的示例如下:(https://en.cppreference.com/w/cpp/io/manip/quoted

void default_delimiter() {
  const std::string in = "std::quoted() quotes this string and embedded \"quotes\" too";
  std::stringstream ss;
  ss << std::quoted(in);
  std::string out;
  ss >> std::quoted(out);

  std::cout << "Default delimiter case:\n"
    "read in     [" << in << "]\n"
    "stored as   [" << ss.str() << "]\n"
    "written out [" << out << "]\n\n";
}

 运行结果:

Default delimiter case:
read in     [std::quoted() quotes this string and embedded "quotes" too]
stored as   ["std::quoted() quotes this string and embedded \"quotes\" too"]
written out [std::quoted() quotes this string and embedded "quotes" too]

  

 看出了什么呢?感觉不够清晰,为啥这示例要经过stringstream折腾下呢,不纯粹了,改改吧:

 

void default_delimiter() {
  const std::string in = "std::quoted() quotes this string and embedded \"quotes\" too";

  auto r1 = std::quoted(in);
  std::string out{"a string a \\,b \",c \\\""};
  auto r2 = std::quoted(out);

  std::cout << "Default delimiter case:\n"
    "read in     [" << in << "]\n"
   // "stored as   [" << ss.str() << "]\n"
    "written out [" << out << "]\n\n";
}

运行结果:

Default delimiter case:
read in     [std::quoted() quotes this string and embedded "quotes" too]
written out [a string a \,b ",c \"]

  

 

改的过程中,遇到第一个问题,这是个函数还是个函数对象或所谓的“可调用体”,看会cppreference网站中的原型是这样的:

template< class CharT >
/*unspecified*/ quoted( const CharT* s,
                        CharT delim = CharT('"'), CharT escape = CharT('\\') );

看着是函数,那,真正关心的函数返回值类型又是啥,那注释的英文单词是“未指定”的意思吧(词典查的)。呃好吧,在vs中转到微软版本的实现看下:

template <class _Elem, class _Traits, class _Alloc>
_NODISCARD _Quote_out<_Elem, _Traits, typename basic_string<_Elem, _Traits, _Alloc>::size_type> quoted(
    const basic_string<_Elem, _Traits, _Alloc>& _Str, _Elem _Delim = _Elem('"'), _Elem _Escape = _Elem('\\')) {
    using _Qobj = _Quote_out<_Elem, _Traits, typename basic_string<_Elem, _Traits, _Alloc>::size_type>;
    return _Qobj(_Str.c_str(), _Str.size(), _Delim, _Escape);
}

它这版本返回的应该是 “_Quote_out<_Elem, _Traits, typename basic_string<_Elem, _Traits, _Alloc>::size_type>”这个模板类型的对象。_Quote_out模板类再瞅眼:

template <class _Elem, class _Traits, class _Sizet>
struct _Quote_out { // store pointer/length for string
    _Quote_out(const _Elem* _Ptr_obj, _Sizet _Size_obj, _Elem _Delim_obj, _Elem _Escape_obj)
        : _Ptr(_Ptr_obj), _Size(_Size_obj), _Delim(_Delim_obj), _Escape(_Escape_obj) {}

    const _Elem* _Ptr; // pointer to string
    _Sizet _Size; // length of string
    _Elem _Delim; // delimiter element
    _Elem _Escape; // escape element

    _Quote_out& operator=(const _Quote_out&) = delete;
};

看着还不是太大。也没用太新的技术,凑合能看懂。

三个模板形参,一个构造函数,四个属性,删除了下赋值操作符(呃,没有删除拷贝构造函数)。

主要功能是啥?构造函数的执行过程也就几个赋值。得看周边了。(追的有点烦了)

在iomanip文件中能看到的有意义的也就一个重载的 <<操作符(作用是将_Quote_out类型对象数据写入流中)。

 是的,只有<<操作符的重载,那示例代码中的 >>对 std::quoted返回值的作用呢,是的quoted在vs这个实现中有几个重载,具体来说,在iomanip文件中看到了四个(其中一个是#if _HAS_CXX17中的),这也是和cppreference网站中的是一致的。

四个重载主要都是参数一的变化,然后再vs的实现中,返回值,有三个是返回的_Quote_out对象,一个返回的是_Quote_in模板对象。而_Quote_in类同时重载了<<和 >>操作符。

 所以对于语句”ss >> std::quoted(out);“,是有过一个_Quote_in临时对象(经std::quoted函数构造并和out这个string对象关联),这个临时对象,从ss流中接收了数据,其实是存储操作到了关联的out这string对象上了。

out做为 quoted函数的第一个参数,在函数体中传给了_Quote_in的构造函数的第一个形参,构造函数中收到这个实参,存给了类的_Str属性(是个引用),在重载的>>操作符中取其引用,对其操作,所以最终还是操作的quoted函数的实参那个对象。

 

 目前,从源码看,quoted函数,返回的类型是个对象,这个对象并没什么实际作用,只是能和 basic_ostream和 basic_istream 进行交互反应。具体功能也体现在对应的两个操作符重载里。

可能能用的常见也就那几个流了,输入、输出流、字符串流、文件流。

 

 

 

 它的作用是什么呢,用于什么场景呢

标签:std,string,quoted,Quote,quotes,试用,out
From: https://www.cnblogs.com/xiarl/p/17511417.html

相关文章

  • stdlib.h
      ......
  • C++面试八股文:用过std::set/std::map吗?
    某日二师兄参加XXX科技公司的C++工程师开发岗位第27面:面试官:用过std::set/std::map吗?二师兄:用过。面试官:能介绍一下二者吗?二师兄:std::set是一个有序的集合,其中的元素是唯一的,即每个元素只能出现一次。一般用于去重和自动排序。二师兄:std::map同样是有序组合,只不过它不止有ke......
  • C++面试八股文:用过std::set/std::map吗?
    某日二师兄参加XXX科技公司的C++工程师开发岗位第27面:面试官:用过std::set/std::map吗?二师兄:用过。面试官:能介绍一下二者吗?二师兄:std::set是一个有序的集合,其中的元素是唯一的,即每个元素只能出现一次。一般用于去重和自动排序。二师兄:std::map同样是有序组合,只不过它不止有key......
  • TiDB 7.1.0 资源管控特性试用
    作者:啦啦啦啦啦一.背景印象里2022年初的时候就有小伙伴在asktug提出TiDB未来是否会有多租户功能的问题了,没想到这么快就已经GA了。资源管控特性(ResourceControl)可以说是TiDB7.1中最亮眼的功能之一,使得TiDB具备了多租户隔离的能力。合理地利用资源管控特性可以减......
  • 试用Proxmox VE 8.0搭建云桌面系统
    6月22日发布了其服务器虚拟化管理平台Proxmox虚拟环境的稳定版0.12。这个主要版本基于最新的Debian7(“书虫”),并为ProxmoxVE4.8或旧版本的用户提供了经过广泛测试和详细的升级路径,以实现顺利升级。ProxmoxVE0.6使用较新的Linux内核2.8作为稳定的默认值,并包括对虚拟环境(如QE......
  • 跨平台开源远程连接工具rustdesk
    rustdeskhttps://github.com/rustdesk/rustdeskhttps://gitee.com/mirrors/rustdesk......
  • std::future 如何保存多个对象进行同步等待
    std::future是一个C++11引入的标准库类,可用于异步获取计算结果。通常情况下,std::future可以通过get()函数来等待异步操作完成,并获取其结果。如果需要等待多个异步操作完成并获取它们各自的结果,可以使用std::future的姊妹类std::shared_future来实现。std::shared_futu......
  • C++面试八股文:std::deque用过吗?
    某日二师兄参加XXX科技公司的C++工程师开发岗位第26面:面试官:deque用过吗?二师兄:说实话,很少用,基本没用过。面试官:为什么?二师兄:因为使用它的场景很少,大部分需要性能、且需要自动扩容的时候使用vector,需要随机插入和删除的时候可以使用list。面试官:那你知道STL中的stack是如何实......
  • 长亭waf-ce 版本试用
    最近长亭提供了ce版本的waf,部分开源了(部分管理UI,t1k部分,部分语义分析自动机引擎)运行离线下载docker镜像以下地址http://demo.waf-ce.chaitin.cn/image.tar.gz加载镜像catimage.tar.gz|gzip-d|dockerloaddocker-compose文件 networks:safeli......
  • c++ std::execution::par,std::execution::par_unseq
    #include<algorithm>#include<chrono>#include<cstdint>#include<execution>#include<iostream>#include<random>#include<vector>std::random_devicerd;std::mt19937_64mt{rd()};template<typenameT>......