【发布时间】:2012-09-17 20:13:54
【问题描述】:
给定一个类实例和一个指向字段的指针,我们可以获得指向该类实例的字段变量的常规指针 - 就像下面代码中的最后一个赋值一样;
class A
{
public:
int i, j;
};
int main(){
A a;
int A::*p = &A::i;
int* r = &(a.*p); // r now points to a.i;
}
是否可以反转这种转换:给定类实例A a; 和int* r 获得int A::* p(如果给定的指针不在给定的实例中,则为NULL ptr),如代码所示:
class A
{
public:
int i, j;
};
int main(){
A a;
int A::*p = &A::i;
int* r = &(a.*p); // r now points to a.i;
int A::*s = // a--->r -how to extract r back to member pointer?
}
我能想到的唯一方法是编写一个函数,该函数采用 A 的每个已知字段,计算给定实例的地址并与给定地址进行比较。然而,这需要为每个类编写自定义代码,并且可能难以管理。它的性能也不理想。
我可以想象这种转换可以由编译器在我知道的所有实现下的几个操作中完成 - 这种指针通常只是结构中的一个偏移量,所以它只是一个减法和范围检查,看看给定的指针是否真的在这个类存储。虚拟基类增加了一些复杂性,但我认为没有什么编译器无法处理。然而,似乎因为它不是标准所要求的(是吗?)没有编译器供应商关心。
还是我错了,这种转换存在一些根本问题?
编辑:
我发现对我所询问的内容存在一些误解。简而言之,我问的是:
- 已经有一些实现(我的意思是在编译器级别),但由于几乎没有人使用它,几乎没有人知道它。
- 标准中没有提到它,也没有编译器供应商提到它,但原则上它是可以实现的(再一次:由编译器,而不是编译的代码。)
- 这样的操作存在一些深层次的问题,我错过了。
我的问题是 - 其中哪一个是真的?如果是最后一个 - 潜在的问题是什么?
我不是在寻求解决方法。
【问题讨论】:
标签: c++ pointers type-conversion field