2009-11-10 191 views
15

我怎樣才能得到由STL容器持有的元素的類型?檢查stl容器中元素的類型 - C++

+1

究竟你在這裏做什麼?由於C++是靜態類型的,因此通常應該知道元素是什麼類型(例如,向量保存整數)。如果你能解釋爲什麼你不知道類型是什麼,以及你想用什麼類型的話,那將有助於回答這個問題。 – 2009-11-10 16:11:10

+0

@David Thornley:'模板 void foo(std :: template arg){/ *在這裏,我們不知道元素類型是什麼* /}'我認爲這是一個很常見的情況。 – jalf 2009-11-10 16:42:32

+0

@Jalf:在這一點上是真的。但是在那個時候foo()只是一個概念。但只要你使用foo(),你也知道類型。 – 2009-11-10 18:35:48

回答

14

對於一般的容器將是X::value_type名稱。對於關聯容器,它將是X::mapped_typeX::value_type對應於pair<const Key,T>)。它是根據C++標準的第23章。

要檢查類型是否相同,可以使用boost::is_same

20
container::value_type 
+0

確定這已經很好了,但我似乎無法比較container :: value_type返回的兩個值類型。有什麼建議麼? – 2009-11-10 16:02:37

+2

@Patrick:你不能比較「value_type返回的值」,因爲value_type是一個類型,而不是一個值。因此比較兩個value_types是一個靜態操作,而不是運行時。根據你想達到的目標,你可能想看看Boost.TypeTraits中的「is_same」:http://www.boost.org/doc/libs/1_40_0/libs/type_traits/doc/html/boost_typetraits/reference /is_same.html – 2009-11-10 16:16:32

+2

@Patrick:您要求存儲在向量中的* type *元素,而不是元素的*值*。你可以比較這些值,你不能比較類型(至少不是沒有很多元編程技巧) - 也許你應該解釋你正在嘗試做什麼。 – jalf 2009-11-10 16:43:42

0

從某種意義上說? 也許使用RTTI和typeid()?

也許你不得不使用容器::值類型,其中容器是你的容器(例如性病::向量)

阿列克

0

您需要給我們更多的上下文。如果你的意思是你想在編譯時知道這個值,所以很容易改變它,然後使用container::value_type

typedef vector<int> coordinates; 

coordinates seq; 
fib::value_type elem = seq.back(); // it's easy to change int type 

如果你的意思是,容器可以容納各種混凝土(派生)類型,您要在運行時認識他們,那麼你或許應該重新評估你的方法。在面向對象的編程中,在運行時隱藏類型有時是一種強有力的方法,因爲這意味着您對於正在處理的內容做出更少的假設。你當然可以使用RTTI,但可能有更好的方法:我們需要更多的上下文來說明。

如果你想比較類型,那麼你可能正在運行時的路徑。 C++支持多態性,這基本上就是您正在尋找的類型比較 - 但內置於語言中。你想根據類型執行一組不同的指令嗎?多態性允許您根據對象的類型執行不同的功能。你不需要編寫一行額外的代碼 - 只能從一個公共基礎派生。

0

使用這樣的事情:

if (typeid(yourVariable)==typeid(YourClass)) //... 

阿列克

+0

或dynamic_cast <>如果你想測試繼承鏈;) – 2009-11-10 16:13:00

+0

但只有當你的類型有虛擬方法。 – 2009-11-10 18:33:39

+0

dynamic_cast當然用於多態指針。我沒有提到它。你是對的。感謝您指出它;) – 2009-11-10 21:03:32

3

檢查是否兩種類型,同樣可以像這樣實現的(沒有RTTI,值可用在編譯時):

template <class T, class U> 
struct same_type 
{ 
    static const bool value = false; 
}; 

//specialization for types that are the same 
template <class T> 
struct same_type<T, T> 
{ 
    static const bool value = true; 
}; 

//sample usage: 
template <class FirstContainer, class SecondContainer> 
bool containers_of_same_type(const FirstContainer&, const SecondContainer&) 
{ 
    return same_type< 
     typename FirstContainer::value_type, 
     typename SecondContainer::value_type 
    >::value; 
} 

#include <vector> 
#include <list> 
#include <iostream> 

int main() 
{ 
    std::cout << containers_of_same_type(std::vector<int>(), std::list<int>()); 
    std::cout << containers_of_same_type(std::vector<char>(), std::list<int>()); 
} 

(這基本上是boost::is_same的工作方式,減去某些編譯器的解決方法。)

+0

哇,這很聰明 – 2009-12-04 02:41:34