来自包装器接口的动态强制转换
dynamic cast from a wrapper interface
在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;
};
有了这个,我想能够做
SomeDerived *a = new SomeDerived;
IWrapper *x = new Wrapper<SomeDerived>(a);
SomeBase *b = x->dynamic_cast_to<SomeBase>()
如果SomeDerived
确实继承了SomeBase
,那么dynamic_cast_to()
应该返回一个指针,如果不是,则NULL
应该返回指针,这与普通dynamic_cast
的工作方式相同。
这可能吗?
给IWrapper
一个虚拟析构函数并使用dynamic_cast
。
我很惊讶有人问我如何实现dynamic_cast_to
函数。
那么如何避免考虑标准dynamic_cast
呢?
我认为这不能用于任意类型的t和U。原因是编译器必须在编译时为特定类型对生成dynamic_cast代码,并且不存在在编译时同时已知这两种类型的地方。
如果你可以限制IWrapper只适用于从某个具有虚拟成员功能的基础派生的类型,那么它可以这样工作:
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; }
};
这是不可能的,因为IWrapper对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;
}
相关文章:
- 如何将这个C++哈希表转换为动态扩展和收缩,而不是使用硬设置的最大值
- 重构使用动态强制转换的 std::set 的比较运算符
- 指针类型类成员的动态强制转换的恒定性是什么?
- 调用不在基类中的派生类函数而不进行动态强制转换,以最大程度地提高性能
- 虚拟成员函数的定义是否强制在同一转换单元中动态初始化静态数据成员?
- 为了访问方法,从基类动态转换为派生类
- 如何对以下程序使用静态或动态转换
- 使用静态转换,因为动态转换失败.不好的做法?
- 动态转换 qspinbox 到 qdoublespinbox
- C++动态转换失败/子对象被视为父对象
- 关于带有模板类的C++动态转换
- 将基体动态转换为派生对象
- sharedptr的动态转换
- 如何动态转换模板类
- 动态转换中的错误
- 如何从另一个kext动态转换类
- Xerces.动态转换DOMNode指针到DOMElement返回一个nullptr
- 难以理解c风格的类型转换和动态转换
- 引用的动态转换
- 是否可以在c++中的类似接口的体系结构中使用动态转换