当某个类访问成员时,它在某种程度上是否可以充当代理?最简单的方法当然是编写getters/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->()
没有得到你要访问的成员的任何信息(btw:为什么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;
谢谢。这对我来说不起作用,因为我打算包装像int这样的原始类型,但是我给了我正确的灵感。我只是使用一个虚拟包装模板类,并重写了演员操作。 – Ferio