将成员访问运算符与重载调用运算符相结合

Combining member access operators with overloaded call operator

给定一个 class Foo 重载 Boo* operator()(unsigned int),应该如何访问重载运算符?

我最初尝试过

std::unique_ptr<Foo> foo_ptr(new Foo);
Boo* boo_ptr = foo_ptr(1);

但这行不通,所以我试了:

std::unique_ptr<Foo> foo_ptr(new Foo);
Boo* boo_ptr = foo_ptr->(1);

但这也不起作用(我真的没想到它会起作用)。相反,我必须做

std::unique_ptr<Foo> foo_ptr(new Foo);
Boo* boo_ptr = (*foo_ptr)(1);

这比在 Foo 中声明一个方法(例如 ByIndex(unsigned int) 更冗长(并且使它更短更简洁是我首先重载运算符的原因)。

有没有不用使用 * 运算符来获取指针基值的方法?

不,您必须取消引用指针才能访问该对象;所以调用操作员的唯一方法是

(*foo_ptr)(1)
foo_ptr->operator()(1);

一种方法是做个参考:

std::unique_ptr<Foo> foo_ptr(new Foo);
Foo& foo_ref = *foo_ptr;

Boo* boo_ptr = foo_ref(1);

除此之外,我认为 Mike Seymour 是正确的,您无法执行其他任何操作来调用 operator()