在C#中,我可以做以下提升模擬C#的IEnumerable的方式?
class MyClass {
private List<int> lst;
public IEnumerable<int> Numbers { get { return lst; } }
}
這有給予lst
公衆只讀訪問,而List
成員變量暴露給公衆的影響。例如,該課程的用戶可以編寫
foreach (var n in myClass.Numbers) { /* do something with the values */};
但他們不能改變列表或以相反的順序遍歷它。這使我可以在不破壞使用類的代碼的情況下更改實現。
我想要做類似的東西在C++:
class MyClass {
std::vector<int> lst;
public:
/* ???? */ getNumbers() const { return /* ??? */ lst; }
};
// I want to be able to write the following
auto rng = myClass.getNumbers();
auto b = begin (rng);
auto e = end (rng);
// now b and e should be readonly (!) forward (!) iterators
我不關心編譯時的依賴,即我不想用any_range
。然而我想 希望在我的代碼中明確表示我只保證只讀轉發行爲。
對於那些我們不熟悉C#的人,請描述一下'IEnumerable'是什麼,以及你的C#示例是幹什麼的。 –
沒有並行顯式數據結構。 C++使用帶編譯時多態的迭代器(模板)來獲得類似的功能。因此,只需返回'const std :: vector&'和std :: begin和std :: end應該按預期工作。 –
IdeaHat
實際上,JohnB可以只返回一個迭代器範圍 - 也就是說,一對迭代器給出開始和結束,或者更好,帶有前向迭代器的boost :: iterator_range - 從而隱藏底層容器實現。 –