如何在关键字 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 上调用重载 () 运算符?的主要内容,如果未能解决你的问题,请参考以下文章