如何为指向外部存储器的奇特指针实现 operator-> ?

How do I implement a operator-> for a fancy pointer to external memory?

我正在实现一种奇特的指针类型,它包装了一个并行内存控制器,用于类似指针的读取和写入外部 SDRAM。使用要求大致如下:

// High level overview of class definition:
class extern_pointer {
    class extern_value; // Used as temporary for *e_ptr = ...; etc.

    {...}
};

auto e_ptr = hwstl::extern_pointer<struct_in_external_memory>(...);

// set pointer to point to 0x0010000
// extern_pointer&::operator= (e_ptr::address_type); sets internal ptr value
e_ptr = 0x0010000;

// extern_value&::operator= (e_ptr::char_type);
// note: char_type is the minimum size of addressable set of bits,
// variations for extern_value&::operator= are allowed for wider databusses
*e_ptr = 0x60; 

// invokes const extern_pointer&::operator*,
// obtains a copy and implicitly converts to
// struct_in_external_memory
struct_in_external_memory v = *e_ptr; 

现在我一直在为 extern_pointer 实现 operator*,我意识到 operator-> 也是一回事。

对于运算符*,我可以 return 一个临时的 extern_value,它会重载一些运算符以提供类似指针的感觉。
但对于 -> 则不然这种情况,因为它需要 extern_value 来包含所有引用外部存储器的成员和方法。

除了删除 extern_value* operator->() 我还能做些什么吗?

编辑:

声明:

class struct_in_external_memory {
    void MyMethod() { /* changes some internal stuff */ }
};

基本上我想做的是:

e_ptr->MyMethod()

通常,MyMethod 是 struct_in_external_memory 的成员,但 -> 需要 return 一个 'extern_value*'`

好吧,根据 struct_in_external_memory 及其复杂性,您仍然可以实施它。 operator-> 调用链中的最后一个 link 必须是原始指针,这是不可避免的,但这并不意味着它必须是指向实际结构的原始指针。

class extern_value_holder {
   struct_in_external_memory copy;
public:
  extern_value_holder(/*...*/) {
    // this should initialize copy to reflect the value in external memory
  }
  struct_in_external_memory* operator->() && { return &copy; }

  ~extern_value_holder() {
    //Write copy back to external memory
  }
};

此处返回的指针指向您要修改但不能修改的对象的副本。调用者修改它,然后当 extern_value_holder 在包含 obj->member.

的完整表达式结束时达到其生命周期结束时自动同步

这让我们回到了我开头的内容。就看struct_in_external_memory,抄多便宜;它 甚至可以被 复制吗?如果你想支持多线程环境,那么你需要在上面添加同步。

这开始看起来像是很多工作却收效甚微。毕竟只是一个运算符。