如何为指向外部存储器的奇特指针实现 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 © }
~extern_value_holder() {
//Write copy back to external memory
}
};
此处返回的指针指向您要修改但不能修改的对象的副本。调用者修改它,然后当 extern_value_holder
在包含 obj->member
.
的完整表达式结束时达到其生命周期结束时自动同步
这让我们回到了我开头的内容。就看struct_in_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 © }
~extern_value_holder() {
//Write copy back to external memory
}
};
此处返回的指针指向您要修改但不能修改的对象的副本。调用者修改它,然后当 extern_value_holder
在包含 obj->member
.
这让我们回到了我开头的内容。就看struct_in_external_memory
,抄多便宜;它 甚至可以被 复制吗?如果你想支持多线程环境,那么你需要在上面添加同步。
这开始看起来像是很多工作却收效甚微。毕竟只是一个运算符。