C++ operator相关的一个问题

看代码的时候遇到了一个和c++ operator关键字相关的一个问题

1. 问题描述

看到了如下的代码,类parseresult中有一个typedef的声明,而随后声明了该类的一个成员函数booleantype,一时间没看懂这是什么用法。

struct ParseResult {
     typedef bool (ParseResult::*BooleanType)() const;
 public:
		......
     operator BooleanType() const { return !IsError() ? &ParseResult::IsError : NULL; }
		......

2. 问题中涉及到的operator关键字的基本用法

查阅到的资料里,一般都说明C++中的operator主要有两个作用,一是操作符的重载,一是自定义对象类型的隐式转换。我遇到的用法应该属于后者,即自定义对象的隐式转换。

博客https://www.cnblogs.com/zhanggaofeng/p/9938358.html提到,类型转换操作符(type conversion operator)是一种特殊的类成员函数,它定义将类类型值转变为其他类型值的转换。
转换操作符在类定义体内声明,在保留字 operator 之后跟着转换的目标类型。

函数原型:

T1::operator T2() [const];   //T1的成员函数,"(T2)a"

说明:

  1. 转换函数必须是成员函数,不能指定返回类型,并且形参表必须为空;返回值是隐含的,返回值是与转换的类型相同的,即为上面原型中的T2;

  2. T2表示内置类型名(built-in type)、类类型名(class type)或由类型别名(typedef)定义的名字;
    对任何可作为函数返回类型的类型(除了 void 之外)都可以定义转换函数,一般而言,不允许转换为数组或函数类型,
    转换为指针类型(数据和函数指针)以及引用类型是可以的;

  3. 转换函数一般不应该改变被转换的对象,因此转换操作符通常应定义为 const 成员;

  4. 支持继承,可以为虚函数;

  5. 只要存在转换,编译器将在可以使用内置转换的地方自动调用它;

博客[https://blog.csdn.net/weixin_30786657/article/details/97953475]提到,为了实现 智能指针的 ptn == 0 || ptn!=0) || ptn || !ptn, 判断,需要将智能指针隐式转换成bool.
总结下,常见有4种实现方法:

operator bool() {...} 
operator const void*() {...}
typedef T* (CLASS::*CLASSMEMFUNPT) ();    operator CLASSMEMFUNPT() {...}
typedef T* CLASS::*CLASSMEM;                    operator CLASSMEM() {...}

3.个人的理解

这种用法是为了将类类型的对象隐式转换成operator后跟的类型对象,例如以下代码

template<class T> class KinAutoPtr // noncopyable
{
private:
    T * px;
	......
 
    typedef KinAutoPtr<T> this_type;
public:
    typedef T element_type;
    typedef T * this_type::*unspecified_bool_type;
    operator unspecified_bool_type() const// never throws
    {
        return px == 0? 0: &this_type::py;
    }
    ......
};

实际能将KinAutoPtr<T>类型的一个对象隐式类型转换为unspecfied_bool_type类型,而unspecified_bool_type的类型和其return的类型是一致的,在代码中相当于一个T**类型.

而下面这段代码里,ParseResult类型的对象可隐式类型转换成一个形参为空,返回值为 bool类型的一个函数指针。

struct ParseResult {
     typedef bool (ParseResult::*BooleanType)() const;
 public:
		......
     operator BooleanType() const { return !IsError() ? &ParseResult::IsError : NULL; }
		......

虽然明白这种使用方法了,但目前想不到普遍的使用场景。博客https://blog.csdn.net/znzxc/article/details/80385995当中的operator bool()使用场景我还能理解,但更普遍的用法还想不到。据说c++ boost库里有很多这种用法,以后再去看看。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++中,operator一个关键字,用于定义和重载运算符。通过重载运算符,我们可以为自定义的类类型定义特定的操作行为。在给定的引用中,我们可以看到三个示例代码,它们都是用来比较两个person对象的年龄是否相等的。这里使用了"=="运算符进行比较。\[1\]\[2\]\[3\] 在第一个示例代码中,重载函数被定义为成员函数,它接受一个const引用参数,用于比较两个person对象的年龄是否相等。如果年龄相等,则返回true,否则返回false。 在第二个示例代码中,重载函数被定义为非成员函数,它接受两个const引用参数,用于比较两个person对象的年龄是否相等。如果年龄相等,则返回true,否则返回false。 在第三个引用中,给出了在类体中声明(定义)需要重载的运算符的示例。在这个示例中,重载函数也是一个成员函数,它接受一个const引用参数,用于比较两个person对象的年龄是否相等。如果年龄相等,则返回true,否则返回false。 总结起来,C++中的operator关键字用于定义和重载运算符。通过重载运算符,我们可以为自定义的类类型定义特定的操作行为,比如比较两个对象的相等性。 #### 引用[.reference_title] - *1* *2* *3* [C++编程语言中重载运算符(operator)介绍](https://blog.csdn.net/liitdar/article/details/80654324)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值