我有一個指向帶有自定義迭代器的類的智能指標。我需要遍歷它,但找不到任何示例。
struct SomeContrainer
{
int a;
}
struct ListClass
{
std::vector<SomeContrainer>::iterator begin() { return m_devs.begin(); }
std::vector<SomeContrainer>::iterator end() { return m_devs.end(); }
void add( const SomeContrainer& dev ) { m_devs.push_back( dev ); }
private:
std::vector<SomeContrainer> m_devs;
};
typedef std::unique_ptr<ListClass> ListPtr_t;
void Foo_Add( const ListPtr_t& list )
{
SomeContrainer dev1, dev2;
dev1.a = 10;
dev2.a = 100;
list->add(dev1);
list->add(dev2);
}
void DoSomeWorkOtherList( const ListPtr_t& list )
{
for( auto const& dev : list ) // <-- how to iterate over list ???
{}
}
// -----------
ListPtr_t pMyList( new ListClass() );
Foo_Add( pMyList );
DoSomeWorkOtherList(pMyList );
如果我不使用智能指標并且只有一個ListClass list我使用 C 11 并且無法升級的物件,它就可以正常作業。
uj5u.com熱心網友回復:
你需要取消參考它
void DoSomeWorkOtherList( const ListPtr_t& list ) // void(const unique_ptr<ListClass>&)
{
for( auto const & dev : *list ) // <-- how to iterate other list ???
{}
}
沒有必要對問題的代碼,但你可能也想提供的const版本begin和end。
std::vector<SomeContrainer>::const_iterator begin() const { return m_devs.begin(); }
std::vector<SomeContrainer>::const_iterator end() const { return m_devs.end(); }
uj5u.com熱心網友回復:
您有不同的選擇,僅舉幾例:
- 傳遞對串列的常量參考。
void DoSomeWorkOtherList(const ListClass& list)
{
std::cout << "v1 (const ListClass&): ";
for (const auto& dev : list) { std::cout << dev.a << " "; }
std::cout << "\n";
}
- 將 const 原始指標傳遞給串列。
void DoSomeWorkOtherList(const ListClass* list)
{
std::cout << "v2 (const ListClass*): ";
if (list)
{
for (const auto& dev : *list) { std::cout << dev.a << " "; }
}
std::cout << "\n";
}
- 將常量參考傳遞給指向串列的唯一指標。
void DoSomeWorkOtherList(const ListPtr_t& list)
{
std::cout << "v3 (const ListPtr_t&): ";
if (list)
{
for (const auto& dev : *list) { std::cout << dev.a << " "; }
}
std::cout << "\n";
}
為了確定最適合您的選項,參考 C 核心指南會很有幫助。如果函式代碼不暗示所有權更改,一般建議使用指標或參考:
- F.7:對于一般用途,采用 T* 或 T& 引數而不是智能指標
- F.60:當“無引數”是有效選項時,更喜歡 T* 而不是 T&
上述情況的可能呼叫者代碼是:
int main()
{
ListPtr_t upl{std::make_unique<ListClass>()};
upl->add({7});
upl->add({8});
DoSomeWorkOtherList(*upl);
upl->add({9});
DoSomeWorkOtherList(upl.get());
Foo_Add(*upl);
DoSomeWorkOtherList(upl);
}
// Outputs:
// v1 (const ListClass&): 7, 8
// v2 (const ListClass*): 7, 8, 9
// v3 (const ListPtr_t&): 7, 8, 9, 10, 100
演示
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/344275.html
