2013-03-21 65 views
1

如何從一個對象中獲取STL容器的類型?例如,我有一個container變量,我知道它是std::vector<some type>。我需要使用迭代器迭代容器。有沒有辦法在不知道容器類型的情況下聲明迭代器?如何從對象中獲取stl容器的類型?

我可以從代碼當然得到類型,但我很好奇不使用類型。另外我不使用C++ 11。

+1

'auto'就是這樣! – 2013-03-21 14:46:33

+0

你可以顯示一些代碼,你使用「某些類型」的「std :: vector」嗎? – LihO 2013-03-21 14:48:43

+0

你可以顯示一些代碼來說明你遇到的問題。如果你有一個接受'container'作爲參數的函數,那麼類型必須包含 - 除非它是一個模板,但即使在這種情況下,你也可以使用SFINAE來獲得你所需要的。 – Chad 2013-03-21 14:48:50

回答

6

C++ 11有一些不錯的簡單的方法:

auto it = container.begin(); 

或等價:

decltype(container.begin()) it = container.begin(); 

甚至:

decltype(container)::iterator it = container.begin(); 

不過,即使你不能使用類型推演,你不應該在一個情況下,你不能以某種形式打出來的類型或其他(可能涉及模板參數) 。如果編譯器知道它是什麼類型,那麼你也是。

2
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) { ... }表單。

+0

這並沒有真正回答這個問題,但問題通常是如何解決的。 – 2013-03-21 14:50:34

0

從類型得到它:

container::value_type. 

關聯容器; container::mapped_type(container :: value_type對應於pair)。它是根據C++標準的第23章。

使用boost::is_same比較類型

從對象實例得到它:

auto it = container.begin(); 
+0

':: value_type'只適用於類型,不適用於對象。 – 2013-03-21 14:51:51

+0

OP想要獲取元素的類型,對不對? – 4pie0 2013-03-21 14:53:33

+0

來自容器的一個實例。 – juanchopanza 2013-03-21 14:55:00

0

一種方法是用一個模板:

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中。