c++ - 存储指向具有模板函数的基础对象的指针

标签 c++ templates

根据以下代码,我如何在“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/

相关文章:

c++ - 这应该是命名空间还是类?

c++ - 以编程方式列出类中的成员变量名称

c++ - 如何在 C/C++ 程序中使用键盘的特殊键,例如 Command、Shift、Alt、Tab 或功能键?

c++ - c++中文本文件中的重复单词

C++ 模板可移植性

c++ - Libtorrent set_settings 错误

java - 如何折叠 NetBeans 模板中的注释?

c++ - 函数模板特化 - 错误 - ISO C++ 禁止声明没有类型的 ‘parameter’

c++ - 从编译时已知的字符串中检索类型

templates - 在 D 中的模板化方法中条件使用局部变量