是否可以继承模板类并将类型设置为当前尝试从中继承的类的模板化子类?

  • 本文关键字:继承 子类 设置 类型 是否 c++ inheritance
  • 更新时间 :
  • 英文 :


糟糕的标题,我知道。我将说明:

template <typename ValType> struct MemMapFileHashTable : MemMapFileStructured<MemMapFileHashTable<ValType>::kvp> {
    struct kvp {
        uint32_t key;
        ValType val;
    };
    MemMapFileHashTable(const char* fileName, bool write = false, int64_t chunkB = 65536) : MemMapFileStructured(fileName, write, chunkB) { }
};

所以这个想法是我创建一个具有特定ValType的哈希表,而该哈希表又具有具有特定ValType的kvp。

要使用我继承的类,我需要将 kvp 设置为类型说明符,但是由于 kvp 是在哈希表类中声明的,因此它不允许我这样做。有没有办法说服它?

我猜我可以在哈希表中创建一个 MemMapFileStructured 的实例,但这将是我构建的类系列中的第 5 次连续继承,我不想打破我的滚动。

您可以使用额外的声明和typedef 获得等效的结果。例:

template<typename ValType> struct kvp_t {
    uint32_t key;
    ValType val;
};
template <typename ValType> struct MemMapFileHashTable : MemMapFileStructured<kvp_t<ValType>> {
    typedef kvp_t<ValType> kvp;
    MemMapFileHashTable(const char* fileName, bool write = false, int64_t chunkB = 65536) : MemMapFileStructured(fileName, write, chunkB) { }
};

如果您想继续使用主模板中的类型 kvp,请成为我的客人。没有人能够分辨出其中的区别。 MemMapFileHashTable<ValType>::kvp仍将是您所期望的。这可能是我们的小秘密,它真的是另一回事。

事实上,如果你浏览一下C++编译器的库,你可能会发现,哦,比如说std::vector<TYPENAME>::iterator实际上是其他模板。它一直在发生。

最新更新