2013-06-25 40 views
3

我需要一些關於來自我正在學習的編程語言課程的問題的指導。C++中數組的靜態邊界檢查

我們需要想出一種方法來在C++中實現一個數組類,以便對它的元素進行靜態檢查以查找溢出。我們不是要使用C++ 11(靜態斷言),也不要使用任何其他的黑盒解決方案 - 這是一個理論問題,而不是編碼需要的東西。

我們沒有得到在演講幻燈片強烈暗示:

「 是不可能的檢測數組索引溢出時,指數的整數類型 - 不,如果指數的類型對應於數組的大小(它必須是數組類型的一部分) 「

我想過使用固定長度(數組大小)字符串作爲索引,但除了考慮選項之外,我真的沒有得到太多:(。

澄清:好的,這有一些混淆的答覆給我噸,可能是因爲我不清楚 - 所以我會再次強調:

  1. 「靜態」意味着「在編譯時」。 編譯器應提醒用戶溢出(警告/錯誤..)。不是運行時!
  2. 閱讀給我們的「提示」 - 它會被使用。具體來說,該程序可能不會檢查邊界!特別是C++中的at()方法不能被使用或模擬。

在這一切的光我在想什麼,他們想要的是某種形式的轉化 INT - >(指數型) 不知何故失敗或計算在情況下,這些指標的列陣溢出錯誤的價值觀。

希望現在更清楚。謝謝

+0

如果我正確理解你(我可能不是),你可以從std :: vector的at()方法得到一個很好的提示/線索,如果你想創建一個數組類,在邊界檢查。如果用戶試圖訪問超出界限的元素,它應該會引發異常。我不打算給你提供代碼,但仍然希望它有助於作爲指導 – Huy

+0

這聽起來像他要求你重塑['std :: array :: at'](http://en.cppreference.com/W/CPP /容器/陣列/ AT)? –

+1

我認爲你的問題需要改寫。一個類不能靜態檢查自己。雖然理論上可以通過靜態檢查來完成功能,但我懷疑它們是否有用。可能你想問一些其他問題,比如運行時限制檢查? –

回答

2

也許他打算讓你根據值是類型的一部分的類型(例如std::integral_constant<int, value>)來索引數組。使用這個,可以在編譯時檢查大小。但是,如果沒有static_assert,很難想出簡單的方法來斷定一個常數比另一個常數小。

在這裏,我使用比較技巧,比較索引是否小於大小,將其轉換爲整數(如果超出範圍則爲0,否則爲1),將其乘以2並減去1, -1表示超出範圍,或1表示有效),然後創建一個這樣大小的數組。如果索引超出範圍,則會導致編譯錯誤,如果索引有效,則會導致優化。

#include <type_traits> 

template<class T, int count> 
struct array { 
    array() : data() {} 

    template<int N> 
    T& operator[](std::integral_constant<int,N> index) { 
     //compiler error if index is too small 
     char index_is_too_large[(N<count)*2-1]={}; 
     index_is_too_large[0] = index_is_too_large[0]; 
     //second line makes the compiler ignore warnings 

     return data[N]; 
    } 
private: 
    T data[count]; 
}; 

#include <iostream> 
int main() { 
    array<float, 3> thingy; 

    std::integral_constant<int, 2> index2; 
    std::cout << thingy[index2] << '\n'; 

    std::integral_constant<int, 3> index3; 
    std::cout << thingy[index3] << '\n'; //COMPILER ERROR ON THIS LINE 
} 

這似乎是相當先進的限制放在你身上,我認爲你更可能誤解你的教授沿線的某處。