为什么不允许将指针转换为成员:
class B {
public:
virtual void someVirtual() = 0;
};
class D1 : public B{};
class D2 : public B{};
class D3 : public B{};
//all this classes implement someVirtual
struct S {
D1 d1;
D2 d2;
D3 d3;
using SptrB = B S::*;
};
现在允许进行转换:
S s;
auto& ref = s.d1; //type D1&
B& bRef = ref; //conversion to B& is OK
bRef.someVirtual();
但是这个在语义上完全相同的不是:
auto ptr = &S::d1; //type D1 S::*
S::SptrB bPtr = ptr; //conversion error!
(s.*bPtr).someVirtual();
我想在方法foo(const S& s, S:SptrB ptr)
中使用此类转换,我可以根据运行时的某些条件传递&S::d1
,&S::d2
等。