如何在关键字 this 上调用重载 () 运算符?

Posted

技术标签:

【中文标题】如何在关键字 this 上调用重载 () 运算符?【英文标题】:How can I invoke an overloaded () operator on the keyword this? 【发布时间】:2021-12-18 02:56:24 【问题描述】:

以下内容有效,但当我执行 (*this)(5) 部分时感觉很难看。

struct MyStruct

    void operator()(int a)
    
        // Do something with "a"
    

    void myFunc()
    
        (*this)(5);
    
;

我需要重载 () 运算符并在其他类方法中使用它。

【问题讨论】:

this 是一个指针,you can't overload the operators of pointer types 因为它们不是用户定义的。如果这种审美缺陷困扰您,C++ 可能不适合您。类似的事情到处都是。 this 应该是引用而不是指针,但该特性是在引用之前添加到语言中的。 @KarlKnechtel 我不明白你的意思。 OP 无处尝试重载或调用指针 this 的运算符。他显然是在调用*this 上的操作员,这不是一个指针。 @bolov 是的,所以如果这足够了,那么这里不是可重现的问题,应该关闭问题。但我认为情况并非如此。根据我的阅读,OP 希望 not 必须取消引用 this 才能调用运算符。因此抱怨有效语法(*this)(5)“感觉很丑”。 原因我们必须写*this,以便“调用运算符...不是指针”,是this是一个指针(正如我所说)。因此*。取消引用指针,从而获得非指针所指对象。是吗? @KarlKnechtel 我不知道为什么 OP 认为这很丑陋,我只能假设并且尽可能不假设。无论如何,还有其他选项无需显式取消引用指针 this。 是的。但是Bhoo 这样做。我会在代码审查中叫你这样做。让operator() 调用一个命名函数。然后您的代码也可以调用命名函数并进行自我记录。 【参考方案1】:

你有几个选择:

(*this)(5)

this->operator()(5)

或者只是operator()(5)

创建一个您从operator() 中调用的方法,例如:

void do_work(int a)  /* ... */ 
void operator()(int a)  do_work(a); 
void myFunc()  do_work(5); 

你选择哪一个只是个人品味的问题。


只是为了好玩,这里还有一些(荒谬的)选项:

std::invoke(在cmets中提到):

std::invoke(&MyStruct::operator(), this, 5);

mem_fn:

auto call_op = std::mem_fn(&MyStruct::operator());
call_op(this, 5);

λ:

auto call_op = [this] (int a)  operator()(a); ;
call_op(5);

bind_front

auto call_op = std::bind_front(&MyStruct::operator(), this);
call_op(5);

【讨论】:

我个人的投票是第四个选项。使用命名函数以获得更好的自我记录代码。 重述,因为数字发生了变化。我个人投票是否支持可以根据需要调用的命名函数。

以上是关于如何在关键字 this 上调用重载 () 运算符?的主要内容,如果未能解决你的问题,请参考以下文章

运算符重载

java使用this关键字调用本类重载构造器

补知识点(this指针,友元,运算符重载)

构造方法和方法重载 this关键字 方法的传参和递归调用

Kotlin中复合赋值(+=,-=,……)运算符重载

Groovy05_Groovy方法调用与运算符重载