【问题标题】:How can I invoke an overloaded () operator on the keyword this?如何在关键字 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() 调用一个命名函数。然后您的代码也可以调用命名函数并进行自我记录。

标签: c++ oop overloading


【解决方案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);
    

【讨论】:

  • 我个人的投票是第四个选项。使用命名函数以获得更好的自我记录代码。
  • 重述,因为数字发生了变化。我个人投票是否支持可以根据需要调用的命名函数。
猜你喜欢
  • 2015-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多