如何从另一个嵌套 class 中调用某些封闭 class 的嵌套 class 的函数指针成员的值?
How to call the value of a function-pointer member of a nested class of some enclosing class from within another nested class?
这是一个相当令人费解的问题,但我已尝试从我的实际代码库中尽可能地简化代码。假设我有一些 class T
嵌套 classes S
和 M
。我有一些方法 method1
和 method2
of 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
.
接下来,假设我想在 M
的某个方法 method3
中调用 selectedMethod
指向的任何方法。为什么必须这样做:
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->
似乎是多余的。
To me the prefix &t.s->
seems redundant
这似乎只是因为您将指向成员的指针存储在您调用该成员的同一个对象中。但考虑到一般情况
auto foo_ptr = &SomeClass::foo;
SomeClass obj;
(obj*.foo_ptr)();
语法的两部分都是必需的。一个显然表示成员,而另一个表示正在访问的对象。
在您的特殊情况下,对象可能 "appear" 两次,但表达式的两端仍然表示不同的事物。右边t.s.selectedMethod
仍然只指定指针。编译器没有义务检查表达式并从中推断出对象。
这是一个相当令人费解的问题,但我已尝试从我的实际代码库中尽可能地简化代码。假设我有一些 class T
嵌套 classes S
和 M
。我有一些方法 method1
和 method2
of 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
.
接下来,假设我想在 M
的某个方法 method3
中调用 selectedMethod
指向的任何方法。为什么必须这样做:
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->
似乎是多余的。
To me the prefix
&t.s->
seems redundant
这似乎只是因为您将指向成员的指针存储在您调用该成员的同一个对象中。但考虑到一般情况
auto foo_ptr = &SomeClass::foo;
SomeClass obj;
(obj*.foo_ptr)();
语法的两部分都是必需的。一个显然表示成员,而另一个表示正在访问的对象。
在您的特殊情况下,对象可能 "appear" 两次,但表达式的两端仍然表示不同的事物。右边t.s.selectedMethod
仍然只指定指针。编译器没有义务检查表达式并从中推断出对象。