如何自动查询函数调用的结果?

时间:2013-08-12 16:25:09

标签: c++

我想避免像这样的工厂调用中的强制转换

MyObject* O = dynamic_cast<MyObject* >( Factory->Create("MyObject") );

有可能吗?

3 个答案:

答案 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匹配。