包装器接口的动态强制转换 在C++中,我希望能够做到以下几点: struct IWrapper { template<typename U> U* dynamic_cast_to() { ??? } // what to do here? }; template<typename T> struct Wrapper : IWrapper { Wrapper(T* _p) :p(_p) {} T* p; }; struct iwraper{ 模板 U*dynamic\U cast\U to(){???}//在这里做什么? }; 模板 结构包装器:IWrapper{ 包装器(T*\up):p(\up){} T*p; };
有了这个,我希望能够做到包装器接口的动态强制转换 在C++中,我希望能够做到以下几点: struct IWrapper { template<typename U> U* dynamic_cast_to() { ??? } // what to do here? }; template<typename T> struct Wrapper : IWrapper { Wrapper(T* _p) :p(_p) {} T* p; }; struct iwraper{ 模板 U*dynamic\U cast\U to(){???}//在这里做什么? }; 模板 结构包装器:IWrapper{ 包装器(T*\up):p(\up){} T*p; };,c++,templates,casting,C++,Templates,Casting,有了这个,我希望能够做到 SomeDerived *a = new SomeDerived; IWrapper *x = new Wrapper<SomeDerived>(a); SomeBase *b = x->dynamic_cast_to<SomeBase>() SomeDerived*a=新的SomeDerived; IWrapper*x=新包装(a); SomeBase*b=x->dynamic\u cast\u to() dynamic\u cast
SomeDerived *a = new SomeDerived;
IWrapper *x = new Wrapper<SomeDerived>(a);
SomeBase *b = x->dynamic_cast_to<SomeBase>()
SomeDerived*a=新的SomeDerived;
IWrapper*x=新包装(a);
SomeBase*b=x->dynamic\u cast\u to()
dynamic\u cast\u to()
如果确实SomeDerived
继承自SomeBase
并且NULL
如果不继承,则应返回指针,这与正常dynamic\u cast
的工作方式相同
这是可能的吗?给Iwraper一个虚拟析构函数,然后使用
动态\u cast
我很惊讶有人问我这个问题,如何实现动态转换到功能
那么,如何避免考虑标准的动态\U cast
呢?我不认为这可以用于任意类型的t和U。原因是
编译器必须在编译时为特定类型对生成动态转换代码,
在编译时,这两种类型都是已知的
如果可以将iwraper限制为仅适用于从具有虚拟成员函数的特定基派生的类型,那么它可以如下工作:
struct IWrapper {
template<typename U>
U* dynamic_cast_to() { return dynamic_cast<U*>(commonBasePtr()); }
virtual CommonBase* commonBasePtr() = 0;
};
template<typename T>
struct Wrapper : IWrapper {
Wrapper(T* _p) :p(_p) {}
T* p;
virtual CommonBase* commonBasePtr() { return p; }
};
struct iwraper{
模板
U*dynamic_cast_to(){返回dynamic_cast(commonBasePtr());}
虚拟CommonBase*commonBasePtr()=0;
};
模板
结构包装器:IWrapper{
包装器(T*\up):p(\up){}
T*p;
虚拟CommonBase*commonBasePtr(){return p;}
};
不可能这样,因为iwraper不知道关于t的任何信息,也无法访问指针。这应该起作用:
template <typename T>
struct IWrapper {
IWrapper(T* p) : p_(p) {}
template<typename U>
U* dynamic_cast_to() { return dynamic_cast<U*>(p_); }
private:
T* p_;
};
template<typename T>
struct Wrapper : IWrapper<T> {
Wrapper(T* _p) : IWrapper<T>(_p), p(_p) {}
T* p;
};
struct SomeBase {
int a;
};
struct SomeDerived : public SomeBase {
int b;
};
int main()
{
SomeDerived *a = new SomeDerived;
IWrapper<SomeDerived> *x = new Wrapper<SomeDerived>(a);
SomeBase *b = x->dynamic_cast_to<SomeBase>();
return b->a;
}
模板
结构IWrapper{
IWrapper(T*p):p_Up(p){}
模板
U*dynamic_cast_to(){返回dynamic_cast(p)}
私人:
T*p_;
};
模板
结构包装器:IWrapper{
包装器(T*\up):Iwraper(\up),p(\up){}
T*p;
};
结构SomeBase{
INTA;
};
struct SomeDerived:public SomeBase{
int b;
};
int main()
{
SomeDerived*a=新的SomeDerived;
IWrapper*x=新包装(a);
SomeBase*b=x->dynamic_cast_to();
返回b->a;
}
那是行不通的。能够dynamic\u cast
SomeDerived
到SomeBase
并不意味着你可以dynamic\u cast
到包装器
。这就是重点。您要求将包装器
转换为SomeBase
,而不是包装器
。你是什么意思?两张反对票是什么意思?有什么需要解释的吗?他们在我看来很不合适。