c++ 继承和嵌套类

bzzcjhmw  于 2023-05-24  发布在  其他
关注(0)|答案(1)|浏览(166)

我正在尝试实现一个数据结构的不同版本。假设它有一个如下所示的接口(它是简化的):

template <typename T>
class Base {
 public:
  class Iterator {
    virtual auto operator*() -> T& = 0;
  };

 public:
  virtual auto Find(const T& value) -> Iterator = 0;
}

现在我想继承一个实现它的类:

template <typename T>
class Derived : public Base<T> {
 public:
  class Iterator {
    auto operator*() -> T& override {
      /* ... */
    }
  };

 public:
  auto Find(const T& value) -> Iterator override {
    /* ... */
  };
}

问题是,我需要基于Derived的功能实现Iterator,但Find函数的签名由于Derived::Iterator而中断(应该是Base::Iterator)。有没有办法做到这一点,或者我必须给予使用接口类?

slsn1g29

slsn1g291#

据我所知,你试图实现的是与类型擦除或静态多态有关的。您希望Base::Iterator是一个非抽象的通用类型,可以从任何Derived实现构造。
这是一个动态的解决方案,您可以根据自己的需要进行优化

template<typename T>
struct Base
{
// This is the interface that needs to be implemented by the derived class' iterator
    struct IIterator
    {
        virtual T& Get() = 0;
    };
// this is the generalized type that needs to be returned by find()
    struct Iterator
    {
        Iterator(std::unique_ptr<IIterator> impl ):
            _impl(std::move(impl))
        {
        }

        T& operator*() { _impl->Get(); }

        private:
// You can implement small struct optimization by making a byte array big enough
// to store any of the implementations and avoid dynamic memory
        std::unique_ptr<IIterator> _impl;
    };

    virtual Iterator find() = 0;
};

template<typename T>
struct Derived : public Base<T>
{
// Now in derived we implement our iterator
    struct IteratorImpl : Base<T>::IIterator
    {
        IteratorImpl(T* p) : ptr(p) {}

        T& Get() override { return *ptr; }
        T* ptr;
    };

    typename Base<T>::Iterator find() override
    {
        IteratorImpl result(nullptr);
// After finding we need to construct the generalized type from the implementation
        return typename Base<T>::Iterator(std::make_unique<IteratorImpl>( result ));
    }
};

另一种方法是使用模板和CRTP创建静态接口。CRTP是一种技术,涉及使用基类的模板参数将派生类型信息传递回基类,并使用该信息定义或查找基于派生类型的Base迭代器的实现。

相关问题