我想避免像这样的工厂调用中的演员
MyObject* O = dynamic_cast<MyObject* >( Factory->Create("MyObject") );
有可能做到吗?
我想避免像这样的工厂调用中的演员
MyObject* O = dynamic_cast<MyObject* >( Factory->Create("MyObject") );
有可能做到吗?
使Create
方法成为模板?
template<typename T>
T* Create(const std::string& name) const
{
return new T; // Or what you want to do
}
然后你可以做例如
auto o = Factory->Create<MyObject>("MyObject");
让它返回一个带有模板化类型转换运算符的辅助对象。
class Helper
{
void* obj;
public:
template <class T> operator T()
{
return reinterpret_cast<T>(obj);
}
.... Constructors etc
};
为了额外的好处,让它包含对象的 typeid,并检查它是否与 T 匹配。
你可以。
struct sInstantiationProxy
{
private:
void* Obj;
sInstantiationProxy( void* O ): Obj( O ) {};
public:
template<typename T> operator T()
{
return reinterpret_cast<T>( Obj );
}
};
然后:
sInstantiationProxy Create( const std::string& ClassName ) const
{
return sInstantiationProxy( Factory->Create( ClassName ) );
};
现在您可以使用全局Create()
函数,而无需dynamic_cast
:
MyObject* O = Create( "MyObject" );