如何從一個對象中獲取STL容器的類型?例如,我有一個container
變量,我知道它是std::vector<some type>
。我需要使用迭代器迭代容器。有沒有辦法在不知道容器類型的情況下聲明迭代器?如何從對象中獲取stl容器的類型?
我可以從代碼當然得到類型,但我很好奇不使用類型。另外我不使用C++ 11。
如何從一個對象中獲取STL容器的類型?例如,我有一個container
變量,我知道它是std::vector<some type>
。我需要使用迭代器迭代容器。有沒有辦法在不知道容器類型的情況下聲明迭代器?如何從對象中獲取stl容器的類型?
我可以從代碼當然得到類型,但我很好奇不使用類型。另外我不使用C++ 11。
C++ 11有一些不錯的簡單的方法:
auto it = container.begin();
或等價:
decltype(container.begin()) it = container.begin();
甚至:
decltype(container)::iterator it = container.begin();
不過,即使你不能使用類型推演,你不應該在一個情況下,你不能以某種形式打出來的類型或其他(可能涉及模板參數) 。如果編譯器知道它是什麼類型,那麼你也是。
typedef std::vector<some_type> container;
for(container::const_iterator i = container.begin(); i != container.end(); ++i)
// ...
你也有iterator typedef(你可以使用,而不是const_iterator)。如果您使用的是C++ 11,請使用auto或for(auto& value: container) { ... }
表單。
這並沒有真正回答這個問題,但問題通常是如何解決的。 – 2013-03-21 14:50:34
從類型得到它:
container::value_type.
關聯容器; container::mapped_type
(container :: value_type對應於pair)。它是根據C++標準的第23章。
使用boost::is_same比較類型
從對象實例得到它:
auto it = container.begin();
':: value_type'只適用於類型,不適用於對象。 – 2013-03-21 14:51:51
OP想要獲取元素的類型,對不對? – 4pie0 2013-03-21 14:53:33
來自容器的一個實例。 – juanchopanza 2013-03-21 14:55:00
一種方法是用一個模板:
template <class container>
void dosomething(container &c) {
typename container::iterator it = c.begin();
typename container::iterator end = c.end();
while (it != end)
dosomething_with(*it);
}
根據不同的情況,auto
可能是有用的:
for (auto it = container.begin(); it != container.end(); ++it)
dosomething_with(*it);
後者需要C++ 11,但前者可用在C++ 98/03中。
'auto'就是這樣! – 2013-03-21 14:46:33
你可以顯示一些代碼,你使用「某些類型」的「std :: vector」嗎? – LihO 2013-03-21 14:48:43
你可以顯示一些代碼來說明你遇到的問題。如果你有一個接受'container'作爲參數的函數,那麼類型必須包含 - 除非它是一個模板,但即使在這種情況下,你也可以使用SFINAE來獲得你所需要的。 – Chad 2013-03-21 14:48:50