2013-06-04 71 views
0

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

回答

1

您可以創建一個新的類ProgmemMemberType和定義一些賦值運算存儲空間之間的轉換。

const MemberType &MemberType::operator=(const ProgmemMemberType &other) 
{ 
    memcpy_P(this, 
      other.progMemPointer(), 
      sizeof(MemberType)); 
    return *this; 
} 

const ProgmemMemberType &ProgmemMemberType::operator=(const MemberType &other) 
{ 
    // Whatever the reverse of memcpy_P is... 
    return *this; 
} 

然後,你可以寫MemberType member = object->memberobject->member = member和賦值運算符將做的工作。

這是我能想到的最乾淨的解決方案; ->運營商並不真正意味着這種事情。

當然,如果您不想爲每個使用的類型定義新的包裝類,則可以使用模板類。

+0

謝謝。這對我來說不起作用,因爲我打算包裝像int這樣的原始類型,但是我給了我正確的靈感。我只是使用一個虛擬包裝模板類,並重寫了演員操作。 – Ferio