当我在带有重载operator()(aka functors)的类的指针上使用dereference运算符时 - 它就像一个魅力:
struct Functor {
int operator()(int a, float b) {
return a+b;
}
};
Functor g;
Functor * f = &g;
g(1,2.);
(*f)(1,.2);
f->operator()(1,2.f);
但形式
// f->(1,2.f); // doesn't compile (expected unqualified-id)
这是为什么?
在C ++中,点(.
)运算符用于访问对象上的成员和调用方法。在您的示例中,您可以按以下方式使用:
g.operator()(1, 2.);
它会编译好。相反,您可以使用等效(和更常规)表示法来调用运算符,如下所示:
g(1,2.);
这很干净。你要做的是实现相同的清洁操作符调用,但是从指针,使用->
表示法,认为将应用相同的魔法。可悲的是,它并没有这样的方式。在C ++中,p->a()
是(*p).a()
的简写。换句话说,它是一种方式
*p
;(*p).a()
;该解除引用的对象不再是指针(qazxsw poi周围的括号实现了这一点),这就是可以调用点运算符的原因。所以当你写:
*p
你在写什么是这样的:
f->(1,2.f);
这是无效的C ++,因为(*f).(1, 2.f);
不代表(*f)
对象的地址。注意:
Functor
是有效的,因为它意味着:
f->operator()(1,2.f);
哪个有效。它相当于我上面写的第一行:(*f).operator()(1, 2.f);
。
希望这可以帮助。