1.缘由

最近在使用nlohmann的json,发现有些地方不是特别好用,所以就想自己修改一下(目的是为了增加类似jsoncpp中可以//增加注释的功能),在看源码的时候看到了一个迷惑的地方,就是解析json

JSON_HEDLEY_WARN_UNUSED_RESULT
static basic_json parse(detail::input_adapter&& i,
const parser_callback_t cb = nullptr,
const bool allow_exceptions = true)
{
basic_json result;
parser(i, cb, allow_exceptions).parse(true, result);
return result;
}

第一个参数我传入的是一个istream,但是这里接收的是一个类。

调试的时候发现,先创建了一个input_adapater类

class input_adapter
{
public:
// native support
JSON_HEDLEY_NON_NULL()
input_adapter(std::FILE* file)
: ia(std::make_shared<file_input_adapter>(file)) {}
/// input adapter for input stream
input_adapter(std::istream& i)
: ia(std::make_shared<input_stream_adapter>(i)) {} /// input adapter for input stream
input_adapter(std::istream&& i)
: ia(std::make_shared<input_stream_adapter>(i)) {} input_adapter(const std::wstring& ws)
: ia(std::make_shared<wide_string_input_adapter<std::wstring>>(ws)) {} input_adapter(const std::u16string& ws)
: ia(std::make_shared<wide_string_input_adapter<std::u16string>>(ws)) {} input_adapter(const std::u32string& ws)
: ia(std::make_shared<wide_string_input_adapter<std::u32string>>(ws)) {} /// input adapter for buffer
template<typename CharT,
typename std::enable_if<
std::is_pointer<CharT>::value and
std::is_integral<typename std::remove_pointer<CharT>::type>::value and
sizeof(typename std::remove_pointer<CharT>::type) == ,
int>::type = >
input_adapter(CharT b, std::size_t l)
: ia(std::make_shared<input_buffer_adapter>(reinterpret_cast<const char*>(b), l)) {}

在这里找到了istream,一个构造函数。

当时比较懵,还有这种使用方法?用c++这么久没有发现哪里有明确指出这种使用方法。潜意思中觉着可能是隐式转换。

自己写了几个测试程序发现,确实是这样,类如果有一个对应类型的构造函数,是可以默认转换的。

后来查资料,突然想起来,经常用的string不就是这样用吗?

string str = "test";

我们最常用的一种方法,这里就是调用了string里面const char*为参数的构造函数。可以调试查看xstring里面的这个函数

    basic_string(_In_z_ const _Elem * const _Ptr)
: _Mybase()
{ // construct from [_Ptr, <null>)
_Tidy_init();
assign(_Ptr);
}

2.c++类的类型转换(转换构造函数 Converting constructor)

参考 https://en.cppreference.com/w/cpp/language/converting_constructor https://zh.cppreference.com/w/cpp/language/converting_constructor

一个类的构造函数,如果没有声明explicit,并且传入的确定参数只有一个(这里的意思就是,不一定这个构造函数就一个参数,可以多个参数,但是其他参数都是有默认值的),那么这个就是转换构造函数。

作用就是把一个类型隐式的转换成类。

3.explicit

参考 https://zh.cppreference.com/w/cpp/language/explicit

与隐式转换对应出现的就是explicit关键字,既然提供了隐式转换,那么肯定也有禁止隐式转换的方法。explicit关键字就是声明在构造函数前,明确指定,不允许隐式转换构造,必须是明确的

4.user-defined conversion

参考 https://en.cppreference.com/w/cpp/language/cast_operator

实际上上面的隐式转换属于这个范畴,就是用户自定义的转换。允许隐式和显式的转换类与一个其他类型。

使用方法,就是operator加上要转换的类型,加上函数的括号,不能加参数,函数内部返回这个值。

operator conversion-type-id
operator 类型 ()
{
    return 类型;
}
class C1
{
public:
operator int()
{
return ;
}
}; int i1 = C1;

mysql connector中的sqlstring

class SQLString
{
std::string realStr; ~SQLString() {} SQLString() {} operator const std::string &() const
{
return realStr;
}
}
SQLString a = "aaa";
string b = a;

就是在上面这种赋值的时候,会调用到这个函数,帮忙转换成另外一种类型,最好前后加const,防止改变内容

最新文章

  1. 安装第三方模块方法和requests
  2. [原创]java WEB学习笔记107:Spring学习---AOP切面的优先级,重用切点表达式
  3. MVC,MVP 和 MVVM
  4. 实现windows批处理下的计时功能
  5. Python:关于字典的相关操作
  6. ASP.NET MVC使用Bootstrap系列(4)——使用JavaScript插件
  7. 【转】[退役]纪念我的ACM——headacher@XDU
  8. Android开发艺术探索读书笔记——01 Activity的生命周期
  9. Android Studio 想说爱你不容易
  10. Apache OFBiz 学习笔记 之 实体引擎
  11. [置顶] gridview中嵌套gridview(并实现子gridview的数据绑定),页面传值,加密,数据绑定
  12. 上传代码到GitHub时,遇到错误:fatal,The Requested URL return error 403
  13. struts2(二) 表单参数自动封装和参数类型自动转换
  14. css浮动Float
  15. yeah,我的博客成功建立!
  16. 4.ES核心慨念
  17. [USACO17JAN]Subsequence Reversal序列反转
  18. tensorflow training result
  19. ArrayList 和 LinkList 的区别
  20. kenlm的使用

热门文章

  1. 用pyenv管理Python多版本及下载加速方法--Mac上
  2. mongodb数据库环境配置
  3. mini Redis(项目 二)
  4. idea更改之前保存的git账号和密码
  5. 【翻译】Dockerfile参考
  6. 用node发布一个包
  7. vue Router——基础篇
  8. vue中的---MVVM(面试必问)
  9. LINUX中ORACLE 11.2.0.1 升级到11.2.0.4
  10. Oracle的功能性sql