这是一个非常复杂的问题,但我已经从我的实际代码库中尽量简化了代码。假设我有一些类 T
嵌套类 S
和 M
. 我有一些方法 method1
和 method2
的 S
我也有一个指针 selectedMethod
指向两种方法中的一种,默认为 method1
.
class T
{
class S
{
T &t;
double method1(std::vector <double> params);
double method2(std::vector <double> params);
double (S::*selectedMethod)(std::vector <double>) = &S::method1;
}
class M
{
T &t;
double method3(std::vector <double> vec);
}
S s;
M m;
}
如图所示,我把 T
的实例。S
和 M
, s
和 m
分别对应使用指针 t
.
下一步,假设我想调用任何一个方法 selectedMethod
指向 method3
的 M
. 为什么一定要这样做呢?
double T::M::method3(std::vector <double> vec){
double ret = (&t.s->*t.s.selectedMethod)(vec);
return ret;
}
而不是简单的
double T::M::method3(std::vector <double> vec){
double ret = (*t.s.selectedMethod)(vec);
return ret;
}
? 对我来说,前缀 &t.s->
似乎是多余的。
在我看来,前缀
&t.s->
显得多余
这看起来只是因为你把成员的指针存储在你调用成员的同一个对象中。但鉴于一般情况下
auto foo_ptr = &SomeClass::foo;
SomeClass obj;
(obj*.foo_ptr)();
句法的两个部分都需要。其中一个显然表示成员,而另一个则表示这个 对象 被访问的对象。
在你的特殊情况下,对象可能会 "出现 "两次,但表达式的两端仍然表示不同的东西。在右手边 t.s.selectedMethod
仍然只是指定了指针。编译器没有义务检查表达式并从中推断出对象。