簡體   English   中英

數據訪問器類型的const正確性 - 更好的解決方案?

[英]const-correctness of data-accessor types - better solution?

我正在開發一個圖像類,它可以處理具有不同像素布局(RGB,RGBA,灰色,拜耳等)的圖像。 要訪問像素,可以調用image.at<PixelType>(x,y) ,返回“訪問者”。 具體的Accessor實現依賴於模板參數。 但是現在我遇到了一些關於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方法有一個非const和一個const實現。 根據constness,訪問者的模板參數設置為truefalse 但是現在我有兩種不同的類型(const和非const)每個訪問器/像素類型,這使得有必要編寫轉換構造函數,因為否則main()函數中顯示的測試用例將無法工作。

現在的問題是:有沒有更好的方法來實現這一目標? 使用模板參數作為const指示器感覺有點不好。 使用Accessorconst Accessor會好得多。 另一方面,這類似於std-library對::iterator::const_iterator 任何人都有這種情況的經驗嗎?

你可以(過度)將參數從兩個布爾狀態推廣到任何值類型:

template<typename Value>
class Accessor {
public:    
    Accessor(Value& data) 
        : data(data)
    {}

    template<typename T, EnableIf<std::is_convertible<T&, Value&>>...>
    Accessor(Accessor<T> const& other)
        : data(other.data)
    {}

    Value& data;
};

顯然這與你所擁有的沒什么不同,除了另一種形式:不是Accessor<false>Accessor<true> ,你有Accessor<DataType>Accessor<DataType const>

好處是熟悉:所有例如std::unique_ptr<T>std::shared_ptr<T>std::reference_wrapper<T> (甚至T* )的行為方式相同。 特別是,這種家庭化應該有希望擴展到編譯器錯誤,即從Accessor<DataType const>Accessor<DataType>的轉換不足,就像你不能從int const*轉換為int*

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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