C++ 如何自动键入函数调用的结果?

C++ 如何自动键入函数调用的结果?,c++,C++,我想避免像这样的强制转换工厂调用 MyObject* O = dynamic_cast<MyObject* >( Factory->Create("MyObject") ); MyObject*O=dynamic_cast(工厂->创建(“MyObject”); 可以这样做吗?将创建方法作为模板 template<typename T> T* Create(const std::string& name) const { return new T

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

MyObject* O = dynamic_cast<MyObject* >( Factory->Create("MyObject") );
MyObject*O=dynamic_cast(工厂->创建(“MyObject”);

可以这样做吗?

创建方法作为模板

template<typename T>
T* Create(const std::string& name) const
{
    return new T;  // Or what you want to do
}
模板
T*Create(const std::string&name)const
{
返回新的T;//或您要执行的操作
}
然后你可以做

auto o = Factory->Create<MyObject>("MyObject");
auto o=Factory->Create(“MyObject”);

是否将
创建
方法作为模板

template<typename T>
T* Create(const std::string& name) const
{
    return new T;  // Or what you want to do
}
模板
T*Create(const std::string&name)const
{
返回新的T;//或您要执行的操作
}
然后你可以做

auto o = Factory->Create<MyObject>("MyObject");
auto o=Factory->Create(“MyObject”);
您可以

struct sInstantiationProxy
{
private:
    void* Obj;
    sInstantiationProxy( void* O ): Obj( O ) {};
public:
    template<typename T> operator T()
    {
        return reinterpret_cast<T>( Obj );
    }
};
现在,您可以使用全局
Create()
函数而不使用
dynamic\u cast

MyObject* O = Create( "MyObject" );
你可以

struct sInstantiationProxy
{
private:
    void* Obj;
    sInstantiationProxy( void* O ): Obj( O ) {};
public:
    template<typename T> operator T()
    {
        return reinterpret_cast<T>( Obj );
    }
};
现在,您可以使用全局
Create()
函数而不使用
dynamic\u cast

MyObject* O = Create( "MyObject" );

使其返回带有模板化类型转换运算符的辅助对象

class Helper
{
  void* obj;
public:
  template <class T> operator T()
  {
    return reinterpret_cast<T>(obj);
  }
  .... Constructors etc
};
类助手
{
void*obj;
公众:
模板运算符T()
{
返回重新解释(obj);
}
……施工人员等
};

要获得额外的好处,请使其包含对象的typeid,并检查它是否与T的typeid匹配。

使其返回带有模板化类型转换运算符的帮助对象

class Helper
{
  void* obj;
public:
  template <class T> operator T()
  {
    return reinterpret_cast<T>(obj);
  }
  .... Constructors etc
};
类助手
{
void*obj;
公众:
模板运算符T()
{
返回重新解释(obj);
}
……施工人员等
};


为了增加额外的好处,请使其包含对象的typeid,并检查它是否与T的typeid匹配。

您是否可以包含有关如何实现工厂功能的更多详细信息?您是否可以切换到
工厂->创建()
?我只能使用字符串,因为类名来自文件。Create返回void*现在如果您知道编译时对象的确切类型,为什么要使用工厂?只需创建对象。您可以包含有关如何实现factory函数的更多详细信息吗?您可以切换到
工厂->创建()
?我只能使用字符串,因为类名来自文件。create返回void*现在如果您在编译时知道对象的确切类型,为什么要使用工厂?只需创建对象。你能在没有模板的情况下完成吗?我不想在这里使用自动类型。
auto
不是一个类型,它只是告诉编译器根据用于初始化声明的类型来确定声明的类型。这个关键字的含义在C++98和C++11之间发生了变化,在前者中,它只是显式地给出了一个对象的自动持续时间。自动持续时间实际上是默认值,这就是为什么没有人在C++98中使用它的原因。你能在没有模板的情况下使用它吗?我不想在这里使用自动类型。
auto
不是一个类型,它只是告诉编译器根据用于初始化声明的类型来确定声明的类型。这个关键字的含义在C++98和C++11之间发生了变化,在前者中,它只是显式地给出了一个对象的自动持续时间。自动持续时间实际上是默认值,这就是为什么没有人在C++98中使用它的原因。@Andrew:Changed
dynamic\u cast
reinterpret\u cast
。我使用此代码段的代码没有使用
void*
。所以,它不是固定的。reinterpret_cast总是由实现定义的,这是一种代码味道。虽然它在实践中确实有效,但我还是建议改为静态强制转换。@UlrichEckhardt No.
reinterpret\u cast
有非常严格的要求,其中定义了非常标准的行为。您可以使用
T*
,将其强制转换为
void*
,然后返回到
T*
,而无需调用任何实现定义的行为:对
派生的*
执行相同的操作,将其转换为
void*
Base*
,您就如履薄冰了。是的,您确实可以通过重新解释强制转换往返a->B->a,但是,如果B是指向基类的指针或者是空指针,那么您可以对static_cast执行相同的操作,所以这里比较的是苹果和桔子。此外,在某些情况下,reinterpret_cast会编译(但会在运行时爆炸),而静态_cast不会编译。可以叫我偏执狂,但我更喜欢编译器错误而不是运行时错误。另外,在C++98中,对void*的隐式转换的逆操作是静态转换,而不能保证使用reinterpret转换,这是它的“实现定义”部分。@Andrew:将
动态转换
更改为
reinterpret转换
。我使用此代码段的代码没有使用
void*
。所以,它不是固定的。reinterpret_cast总是由实现定义的,这是一种代码味道。虽然它在实践中确实有效,但我还是建议改为静态强制转换。@UlrichEckhardt No.
reinterpret\u cast
有非常严格的要求,其中定义了非常标准的行为。您可以使用
T*
,将其强制转换为
void*
,然后返回到
T*
,而无需调用任何实现定义的行为:对
派生的*
执行相同的操作,将其转换为
void*
Base*
,您就如履薄冰了。是的,您确实可以通过重新解释强制转换往返a->B->a,但是,如果B是指向基类的指针或者是空指针,那么您可以对static_cast执行相同的操作,所以这里比较的是苹果和桔子。此外,在某些情况下,reinterpret_cast会编译(但会在运行时爆炸),而静态_cast不会编译。可以叫我偏执狂,但我更喜欢编译器错误而不是运行时错误。此外,在C++98中,对void*的隐式转换的逆操作是静态的转换,而不能保证使用reinterpret转换,这是转换的“实现定义”部分。