我正在研發一款遊戲引擎,目前我堅持設計IO系統。我已經這樣做了,引擎本身並不處理任何文件格式,而是讓用戶通過創建一個*.dll
文件來實現他想要的任何內容,其中包含了一些名爲函數的函數。雖然這本身並不是問題,但我主要關心的是在使用引擎期間可能會看到的含義。C++中的度量單位
我設計了一個簡單的resource
接口作爲用戶可以考慮的所有事情的基類,我試圖通過將簡單的子類專用於常用數據類型來擴展它,所以用戶不會必須自己實施基礎知識(目前我在考慮audio
,image
,data
和mesh
)。從audio
這個課開始,我已經總結了一個奇怪的問題,同時試圖決定我應該存儲關於採樣率的信息的類型。通常的單位是赫茲,所以我決定把它做成unsigned int
。
但是這裏有一個小問題 - 如果用戶試圖設置它在千赫?讓我們假設一些抽象文件格式可以將它存儲在兩個單元中片刻。我做了一個簡單的包裝類命名的單位類型:
class hertz{
private:
unsigned int value;
hertz(){};
public:
operator unsigned int();
hertz(unsigned int value);
};
,並決定讓用戶也可以使用千赫:
class kilohertz{
private:
float value;
kilohertz(){};
public:
operator hertz();
kilohertz(float value);
};
雖然audio
類內部的功能,它可以讓用戶設置採樣率被宣佈爲track& samplingRate(units::hertz rate);
。用戶必須通過明確地說,他使用的是什麼量級稱之爲:
someAudioFile.samplingRate(hertz(44100));
someAudioFile.samplingRate(kilohertz(44.1));
我的問題是:
有沒有更好的辦法來迫使用戶在一個簡單易用的測量單元和優雅的方式?設計模式可能,或者一些巧妙的使用typedefs?
另請注意,在創建引擎的過程中,我可能需要更多的單位,這將與赫茲不兼容。從我的頭頂開始 - 我可能希望用戶能夠通過執行units::rgb(123,42,120)
和units::hsl(10,30,240)
來設置像素顏色。
我試過尋找一個可行的答案,只發現this question,但OP只需要數量級而不確保單位與其他單位不兼容。
另請注意我使用舊的C++
版本,而不是C++11
。雖然發佈任何版本的解決方案都很好,但如果我也可以使用它,那將是非常好的:)
難道你不能正確記錄你的API嗎? –
是的,爲了避免混淆,也許你應該讓你的API堅持一個標準,赫茲或千赫,而不是兩個。 – leetNightshade
記錄我的API不會改變任何事情,因爲我希望用戶能夠在使用時兼顧兩者 - 例如 - 設置顏色。所以這不完全是一個解決方案。也許它會和赫茲一起工作,但那只是一個單位。 –