[英]Is it possible to overload both the () operator as a dereference and the = operator as assignment in same class?
[英]Operator overload for compound dereference and assignment
使用C ++運算符重載,可以創建一個模擬指針類型的類,因此我正在嘗試使用這種方法抽象FILE
讀取操作。
class FilePointer
{
FILE* file;
size_t position;
FilePointer (FILE* file, size_t position)
{
this->file = file;
this->position = position;
};
public:
FilePointer (FILE* file)
{
this->file = file;
this->position = 0;
};
FilePointer operator+ (size_t offset)
{
return FilePointer(file,position + offset);
};
FilePointer operator++ () // Prefix : ++FilePointer
{
position++;
return *this;
};
FilePointer operator++ (int) // Postfix : FilePointer++
{
FilePointer before = *this;
position++;
return before;
};
FilePointer operator+= (size_t offset)
{
position += offset;
return *this;
};
uint8_t operator* ()
{
fseek(file,position,SEEK_SET);
Uint8 out;
fread(&out,1,1,file);
return out;
};
uint8_t operator[] (size_t offset)
{
return *(*this + offset);
};
};
從上面的代碼片段中可以看出,我能夠找出如何區分增量運算符的變體,從而使給定FilePointer f;
f++
和++f
會表現得很直觀。
但是,如果我想使用此類進行文件寫入怎么辦? 目前,我可以抓取一個字節uint8_t something = f[0];
並且它可以工作,但是如果我想“設置”某些東西,即f[0] = 100;
,則按原樣重載將無法解決此問題。
除了這是否是“良好實踐”(盡管也可以隨意考慮)之外,還有沒有辦法在類的運算符重載中實現此行為?
uint8_t n = f[0];
n++;
f[0] = n;
或者,變得更加幻想,像這樣:
f[1]++;
我想可以做到的一種方法是實現另一個表示“已取消引用的FilePointer”的類,但很好奇是否可以僅對FilePointer類本身進行重載。
我想可以做到的一種方法是實現另一個表示“已取消引用的FilePointer”的類
那幾乎是唯一的方法。 它可以是“代理類型”的對象,可以轉換為uint8_t
(在這種情況下可能是隱式的,盡管通常我不喜歡隱式轉換),但也可以分配給它。
它必須使用FilePointer*
構造,並且必須是friend
以便它可以調用適當的“寫入”功能。
不過,這會有點麻煩,因為它可能很快變成“懸空的”,並在錯誤的位置書寫。 您也可以存儲在代理對象被創建時的當前位置,並尋求回到那個位置當且僅當需要在寫作的時候。 但是,所有尋求並不是很有效。
sloooooow也一次讀取一個字節。
總的來說,盡管您的嘗試令人欽佩,但我還是建議您不要采用這種方法。 你至少可以換FILE*
在一個不錯的類,它fclose
你,如果它超出范圍。
但是很好奇,是否有可能只處理FilePointer類本身的重載。
我不這么認為。 無論您從operator[]
返回的內容是什么,都需要某種魔術狀態,該魔術狀態可以接受“設置”值並連接到FILE*
機械。 返回uint8_t
絕對不會讓您這樣做。
提高1個字符寫入性能的另一種方法可能是,代理文件指針實際上是一個緩沖區,該緩沖區以某種方式收集許多分配,然后在銷毀時將它們全部后台處理到文件中。
使用代理方法要注意的一件事是,調用者可以使用auto
或auto&
保留許多代理對象,並嘗試無序更新它們。 我認為沒有解決此問題的有效方法。
另外, operator --
呢? 盡管c ++庫確實具有單向迭代器的概念。 也許迭代器是更好的隱喻?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.