[英]How can I map a remote device as an array in C++?
我想創建一個C ++對象來包裝外部外圍設備的RAM。 我正在嘗試設置如下內容:
外圍p;
p [4] = 10;
int n = p [5];
為此,每當訪問數組元素時,我都需要讀取或寫入外設。 我無法弄清楚如何使用運算符重載等來執行此操作。我可以返回一個“訪問器”對象,可以在第二行中用作左值:
PeripheralAccessor Peripheral :: operator [](int i);
或者我可以定義一個“簡單”運算符,可用於從第三行的外設讀取int:
int Peripheral :: operator [](int i);
但我不能讓兩者共存以給予外設讀寫訪問權限。 我可以將第二個運算符定義為const(rvalue)運算符,但是它只會被調用為類的const實例,這對我的需求來說還不夠......
希望我已經解釋了我在這里想要實現的目標; 任何人都可以建議我應該怎么做(或者確實是否可能)?
處理此問題的常用方法是使用代理對象:
class register_proxy {
public:
register_proxy &operator=(int value) {
write_value(value);
}
operator int() {
return read_value();
}
};
class peripheral {
register_proxy registers[4];
public:
register_proxy &operator[](int reg_num) { return registers[reg_num]; }
};
我遺漏了一些細節(比如你如何告訴每個register_proxy
讀/寫實際的寄存器號 - 通常是通過將參數傳遞給ctor)。 無論如何,一般的想法很簡單: operator[]
返回對代理對象的引用。 當您在賦值的右側使用它時,會調用代理對象的operator int
(或者它采用的任何類型)。 當代理對象的operator=
在賦值的左側時調用它,所以你試圖在那里寫一個值。
為“PeripheralAccessor”提供int的隱式轉換運算符:
operator int () const;
由於你不能基於返回類型重載,你必須選擇一個或另一個(並且你不能選擇int,因為你沒有得到左值行為)。 但是,您可以為PeripheralAccessor自動轉換為int。
編輯:傑瑞打敗了我。 代碼均勻。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.