簡體   English   中英

如何在C ++中將遠程設備映射為數組?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM