根据以下代码,我如何在“Controller”类中存储指向 Base 的指针?
template< class Derived >
class Base
{
public:
template < typename T >
void Serialise( T* t )
{
Derived* d = static_cast< Derived* >( this );
d->Serialise( t );
}
};
class Derived : public Base< Derived >
{
public:
template < typename T >
void Serialise( T* t )
{
printf( "serialising to object T\n" );
}
};
因此,如果我有一个 Controller 类,它将调用 Serialise 函数并传入要序列化的对象,我最终不得不存储指针及其派生类型,因为它是对象类型的一部分,而我需要的是能够在不知道实际类型是什么的情况下使用 Base 类型:
class Controller
{
public:
void DoSerialise();
private:
Base< Derived >* m_myObject; // I want this to just be Base* m_myObject but cant due to template!
};
最佳答案
简答 - 你不能。
假设模板参数不影响 Base 的接口(interface)(即:Derived 没有出现在任何函数签名中),您可以有一个非模板 Base 类,而派生类可以是模板。然而,这根本不符合您当前的模式。
在你的情况下,如果模板参数确实影响了接口(interface)(我强烈怀疑它在这种情况下确实如此),那么 Controller 需要了解 Derived 以便使用 Base,那么在哪里为了声明 Base,还知道 Derived 的危害。
评论后编辑:
您确定希望任何派生类都能够序列化为任何 类型吗?为什么不具有从 Serialiser
基类派生的类的层次结构,然后 Serialise()
可以接受对类型 Serialiser
的引用并丢失模板参数。
关于c++ - 存储指向具有模板函数的基础对象的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14832793/