【问题标题】:Use templated object within a templated class with different sets of template parameters在具有不同模板参数集的模板类中使用模板化对象
【发布时间】:2021-02-04 11:12:15
【问题描述】:

我正在尝试在模板化类中使用模板化对象,其中对象的模板参数与类所需的模板参数不同。这听起来有点混乱,因为没有正确描述,这里是一个例子。

以下类实现了二叉搜索树:

template <typename KEY, typename VALUE>
class BST{
  public:
    BST(void){
      cache = new GCACHE<uint64_t, BSTObject>(this);
    }

    struct{
     string value;
    }BSTObject;

    GCACHE<uint64_t, BSTObject>* cache;

    ...
}

GCACHE 类实现了一个通用缓存,为了正确运行,它需要一个指向它必须缓存的 BST 的指针。这个指针被传递给 GCACHE 构造函数:

template <typename CKEY, typename OBJECT>
GCACHE{
  public:
   GCACHE( *** pointer to BST, a templated class whoose template types that are not CKEY and OBJECT ***); (A)
}

如何在 (A) 中指定/定义一组不同于 GCACHE 所需的模板参数(示例中的 CKEY 和 OBJECT)? GCACHE对象的模板参数是uint64_tBSTObject,BST对象的模板参数可能是intstring

我真的很困惑。也许我弄错了,解决方案很简单...... 谢谢你的帮助。

我希望上面的例子足够清楚以获得帮助。如果不是,请告诉我,以便我重新提出问题。

【问题讨论】:

  • BST 模板将BSTObject 定义为成员对象,但您还尝试使用BSTObject 作为GCACHE&lt;uint64_t, BSTObject&gt; 模板参数中的类型。目前尚不清楚那应该是什么。
  • 另外,BST 如何实际使用其KEYVALUE 参数? GCACHE(将其视为通用实用程序,与 BST 无关)如何使用其 CKEYOBJECT 参数?
  • BST 类在方法 insert() find() 和 delete() 中使用 KEY 和 VALUE。 GCACHE 类使用 BSTObj 来存储 VALUE 对象以及与 cahce 相关的信息(点击...)

标签: c++ templates template-specialization


【解决方案1】:

GCACHE 需要访问BST 的哪些部分?

如果它只需要访问不依赖于模板参数KEYVALUE的部分,则创建一个BST实现的抽象接口类,并将该类作为@的指针类型987654326@构造函数:

class BSTInterface {
    ...
};

template<typename KEY, typename VALUE>
class BST : public BSTInterface {
    ...
};

template <typename CKEY, typename OBJECT>
GCACHE{
  public:
   GCACHE(BSTInterface *bst); (A)
};

如果GCACHE 确实需要访问依赖于模板参数的BST 部分,那么您还需要将GCACHE 模板化为这些参数:

template <typename CKEY, typename OBJECT, typename KEY, typename VALUE>
GCACHE{
  public:
   GCACHE(BST<KEY, VALUE> *bst); (A)
};

顺便说一下,一般来说,类之间的这种循环依赖会产生紧密耦合,并且可能表明存在设计问题。为什么“通用缓存”需要知道二叉搜索树的存在?或者,如果缓存实现为树,为什么树实现需要知道缓存的存在?

【讨论】:

  • 谢谢Thomas,我想我会遵循抽象类接口的方法。 GCACHE 是通用的,因为它能够缓存每一对(KEY,VALUE)。 GCACHE 需要 BST 指针来检索用于将 BST 序列化到磁盘的 ofstream 对象。
  • 如果它只需要一个ofstream,则只将ofstream 传递给ctor 或序列化函数。
  • 再次感谢 Thomas,但 ofstream 还不够,因为我需要使用 BST 方法以 BST 类识别的正确格式保存缓存项,并且我不想复制代码这样做。
猜你喜欢
  • 2018-06-25
  • 2011-07-26
  • 2020-03-26
  • 1970-01-01
  • 2011-10-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-10
  • 1970-01-01
相关资源
最近更新 更多