我想避免像这样的工厂调用中的强制转换
MyObject* O = dynamic_cast<MyObject* >( Factory->Create("MyObject") );
有可能吗?
答案 0 :(得分:9)
将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");
答案 1 :(得分:2)
你可以。
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" );
答案 2 :(得分:2)
让它返回一个带有模板化类型转换运算符的辅助对象。
class Helper
{
void* obj;
public:
template <class T> operator T()
{
return reinterpret_cast<T>(obj);
}
.... Constructors etc
};
要获得额外奖励,请将其包含对象的typeid,并检查它是否与T匹配。