一个类在访问它的成员时是否有可能充当代理?最简单的方法当然是编写 getter/setter,但这既不灵活又不优雅,因为您必须自己编写所有的 setter,这会使代码膨胀。
问题是我想抽象出一些数据位于微控制器程序中的事实。基本上我想要那个
MemberType member = object->member; // won't work if object lies in progmem
被翻译成类似的东西
MemberType member; // Allocate memory in RAM for the member
memcpy_P(&member,
&object->member, // assuming that this gives a valid pointer to the member
sizeof(MemberType));
在嵌入式 C 中,可以使用地址空间__flash
来做类似的事情。不幸的是,C++ 不支持这一点。
所以我想到了重载operator->()
。不幸的是operator->()
,没有得到您要访问哪个成员的任何信息(顺便说一句:为什么是 wtf?-> 的唯一目的是访问一个成员,那么为什么有人要丢弃这些信息?)。.
根本无法覆盖。
有人知道如何解决这个问题吗?当然,语法不一定是->
。如果可以使用一些深奥的模板构造,我也会很高兴。我不太了解 C++,也许根本不可能。C++ 在元编程方面似乎有点不灵活。
编辑:从答案中得到灵感后,我现在决定使用包装类并覆盖强制转换运算符。
template<typename Type>
class InProgmem {
Type const self; // InProgmem<Type> should be as big as Type
InProgmem(Type val) : self(val) {} // Keep the compiler quiet
public:
operator Type() const {
Type out;
memcpy_P(&out, this, sizeof(Type));
return out;
}
} __attribute__((packed));
// Example use:
PROGMEM prog_uchar foo = 14;
class Test {
public:
InProgmem<unsigned char> bar;
};
Test *baz = (Test*)&foo;
unsigned char bar = baz->bar;