我正在研究一個圖像類,它可以使用不同像素佈局(RGB,RGBA,灰色,拜耳,...)的圖像。要訪問像素,可以撥打image.at<PixelType>(x,y)
,它返回一個「Accessor」。具體的Accessor實現依賴於模板參數。但是現在我遇到了一些關於const正確性的問題。數據訪問器類型的const正確性 - 更好的解決方案?
這裏是一個非常簡單化了實現這有望使得它明顯:
template<bool constAccessor>
class Accessor {
public:
typedef typename boost::mpl::if_c<constAccessor, const int, int>::type DataType;
Accessor(DataType& data)
:data(data) {
}
Accessor(Accessor<false>& other)
: data(other.data) {
}
DataType& data;
};
class Image {
public:
Accessor<false> at(unsigned int x, unsigned int y) {
return Accessor<false>(data);
}
Accessor<true> at(unsigned int x, unsigned int y) const {
return Accessor<true>(data);
}
private:
int data;
};
int main() {
Image img;
const Image& cimg = img;
// get accessor which is non-const
Accessor<false> a1 = img.at(0, 0);
// get a accessor which is const...
Accessor<true> a2 = a1;
// ... modifying a value results in an error
a2.data = 42;
// try to convert a accessor which is const to a non-const version
// ... results in an error
Accessor<false> a3 = a2;
return 0;
}
正如你可以看到有一個非常量和常量執行at
方法。根據常量,訪問器的模板參數設置爲true
或false
。但是現在我有兩種不同的類型(const和non-const),每個訪問器/像素類型都有必要編寫一個轉換構造函數,否則main()
函數中顯示的測試用例將不起作用。
現在的問題是: 有沒有更好的方法來實現這一目標?使用模板參數作爲const指示器感覺不好。使用Accessor
和const Accessor
會更好。另一方面,這與std-library與::iterator
和::const_iterator
所做的相似。 任何人都有這種情況下的一些經驗?
你可以做類似於標準容器對迭代器做什麼的事情,它有兩個不同的迭代器:'iterator'和'const_iterator',迫使程序員考慮使用哪個迭代器。不幸的是,程序員很少考慮它,即使'const_iterator'是最好的,也可以使用普通的'iterator'。 –
@JoachimPileborg我試圖澄清,我認爲我的方法類似於std庫中的一個。任務是如果有更好的解決方案。 – Daniel