當某個類訪問成員時,它在某種程度上是否可以充當代理?最簡單的方法當然是編寫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