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:Changeddynamic\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转换,这是转换的“实现定义”部分。