我正在嘗試創建一個包含自己的迭代器作為元素的向量,但我發現無法完全擴展型別宣告。
using MyVectorType = std::vector<std::vector<...>::iterator>;
// Trying to fill in the ... ^^^
另一種失敗的方法是:
using MyVectorType = std::vector<MyVectorType::iterator>;
使用未宣告的識別符號“MyVectorType”嘗試使用中間宣告也失敗
template <class T>
using MyVectorType_incomplete = std::vector<T>;
using MyVectorType = MyVectorType_incomplete<MyVectorType_incomplete::iterator>;
錯誤:“MyVectorType_incomplete”不是類、
命名空間或列舉
顯然使用指標來解決這個問題。
struct It {
It *iterator;
};
vector<It>;
但是,這意味著您不能使用迭代器介面,并且基本上必須為給定的類重新實作迭代器。
有沒有辦法在 C 中做到這一點?
更一般地說,有沒有一種方法可以創建像上面這樣的遞回型別,在創建之前參考型別?
uj5u.com熱心網友回復:
我不認為這是可能的標準。
要實作您想要的,您必須能夠std::vector<T>::iterator在T不完整時參考。
在 C 17T完全需要實體化之前std::vector<T>,它不能在那里作業。
由于 C 17 標準允許std::vector<T>使用不完整型別進行實體化T,但是只要型別在其任何成員被參考之前是完整的,請參閱后 C 20 草案的[vector.overview]/4。
但是,如果要實作這樣的遞回,則需要能夠繼承或擁有 type 的成員std::vector<T>::iterator。這不僅參考了::iterator型別,而且還需要實體化它,這不能保證在這一點上作業。
讓類繼承自std::vector<T::iterator>也不起作用,因為那時T需要完成。推遲T::iterator到另一個繼承的類也不會起作用,因為這些類然后遞回地依賴于在另一個之前完成。
根據標準庫的實作方式std::vector<T>::iterator,以下可能會起作用,盡管根據標準它在技術上是未定義的行為:
struct MakeMyVectorType : std::vector<MakeMyVectorType>::iterator {
};
using MyVectorType = std::vector<MakeMyVectorType>;
int main() {
MyVectorType v1(10);
MyVectorType v2(v1.begin(), v1.end());
v2.push_back({v1.begin() 5});
MyVectorType v3{{v2.begin()}, {v2.end()}};
std::cout << v1.size() << "\n"; // 10
std::cout << v2.size() << "\n"; // 11
std::cout << v3.size() << "\n"; // 2
}
我也不確定您將如何使用這種型別。
uj5u.com熱心網友回復:
using引入了型別別名。別名是其他事物的名稱。您始終可以用其他東西替換別名。實際上,您必須這樣做才能找出涉及別名的型別的屬性,因為別名沒有自己的屬性。
using MyVectorType = std::vector<MyVectorType::iterator>; // replace the name with the thing named
using MyVectorType = std::vector<std::vector<MyVectorType::iterator>::iterator>; // again
using MyVectorType = std::vector<std::vector<std::vector<std::vector<MyVectorType::iterator>::iterator>; ::iterator>::iterator>; // and again and again
所以你不能有遞回型別別名。
您可以創建遞回型別,但不能使用型別別名關閉回圈。您可以使用指標或模板來完成。像這樣的東西應該是合法的 C :
struct my_vector : public std::vector<std::vector<my_vector>::iterator> {}
但我不知道它對你有多大用處。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/425221.html
上一篇:即使在使用遞回時追加也得到空串列
