C++ - 重载结构取消引用运算符并在 unique_ptr 中使用它

C++ - overload structure dereference operator and use it in unique_ptr

我有一个实现 class 和一个包装器 class,我想通过包装器 class 和结构解引用访问实现 class 实例 (->)操作员。到目前为止,没问题。

class Implementation
{
  public:
    doSomething();
}

class Wrapper
{
  public:
    Implementation* operator->() {
      return _implPtr.get();
    }
  private:
    std::shared_ptr<Implementation> _implPtr;
}

当我像下面这样使用它时它起作用了:

Wrapper wrapper;
wrapper->doSomething();

但是当我将包装器 class 与 unique_ptr 一起使用时,编译器会抛出错误:

auto wrapper = std::make_unique<Wrapper>();
wrapper->doSomething();

错误是“'class Wrapper' 没有名为 'doSomething' 的成员”。

在这种情况下如何访问实现 class?

std::unique_ptr(和 std::shared_ptr)有自己的 operator-> 到 return 它持有的指针。

您的失败代码本质上是这样做的:

auto wrapper = std::make_unique<Wrapper>();
//wrapper->doSomething();
Wrapper *ptr = wrapper.operator->();
ptr->doSomething(); // ERROR!

的确,你的Wrapperclass中没有doSomething()方法。

要执行您正在尝试的操作,您需要取消引用 Wrapper* 指针以访问实际的 Wrapper 对象,然后您可以调用它自己的 operator-> 来访问它的 Implementation*指针,eg:

auto wrapper = std::make_unique<Wrapper>();
(*wrapper)->doSomething();

基本上是这样做的:

auto wrapper = std::make_unique<Wrapper>();
//(*wrapper)->doSomething();
Wrapper &ref = wrapper.operator*();
Implementation *impl = ref.operator->();
impl->doSomething(); // OK!