我怎樣才能得到由STL容器持有的元素的類型?檢查stl容器中元素的類型 - C++
回答
對於一般的容器將是X::value_type
名稱。對於關聯容器,它將是X::mapped_type
(X::value_type
對應於pair<const Key,T>
)。它是根據C++標準的第23章。
要檢查類型是否相同,可以使用boost::is_same
。
container::value_type
確定這已經很好了,但我似乎無法比較container :: value_type返回的兩個值類型。有什麼建議麼? – 2009-11-10 16:02:37
@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
@Patrick:您要求存儲在向量中的* type *元素,而不是元素的*值*。你可以比較這些值,你不能比較類型(至少不是沒有很多元編程技巧) - 也許你應該解釋你正在嘗試做什麼。 – jalf 2009-11-10 16:43:42
從某種意義上說? 也許使用RTTI和typeid()?
也許你不得不使用容器::值類型,其中容器是你的容器(例如性病::向量)
阿列克
您需要給我們更多的上下文。如果你的意思是你想在編譯時知道這個值,所以很容易改變它,然後使用container::value_type
。
typedef vector<int> coordinates;
coordinates seq;
fib::value_type elem = seq.back(); // it's easy to change int type
如果你的意思是,容器可以容納各種混凝土(派生)類型,您要在運行時認識他們,那麼你或許應該重新評估你的方法。在面向對象的編程中,在運行時隱藏類型有時是一種強有力的方法,因爲這意味着您對於正在處理的內容做出更少的假設。你當然可以使用RTTI,但可能有更好的方法:我們需要更多的上下文來說明。
如果你想比較類型,那麼你可能正在運行時的路徑。 C++支持多態性,這基本上就是您正在尋找的類型比較 - 但內置於語言中。你想根據類型執行一組不同的指令嗎?多態性允許您根據對象的類型執行不同的功能。你不需要編寫一行額外的代碼 - 只能從一個公共基礎派生。
使用這樣的事情:
if (typeid(yourVariable)==typeid(YourClass)) //...
阿列克
或dynamic_cast <>如果你想測試繼承鏈;) – 2009-11-10 16:13:00
但只有當你的類型有虛擬方法。 – 2009-11-10 18:33:39
dynamic_cast當然用於多態指針。我沒有提到它。你是對的。感謝您指出它;) – 2009-11-10 21:03:32
給出的類型是靜態已知可以檢查它們是靜態的,而無需使用RTTI通過使用模板特相同。例如使用類似http://www.boost.org/doc/libs/1_40_0/libs/type_traits/doc/html/boost_typetraits/reference/is_same.html或者升壓不可用滾你自己
檢查是否兩種類型,同樣可以像這樣實現的(沒有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
的工作方式,減去某些編譯器的解決方法。)
哇,這很聰明 – 2009-12-04 02:41:34
- 1. 容器元素類型
- 2. C++模板 - 指定容器類型和它容納的容器元素類型
- 3. 回到STL容器元素的參考
- 4. STL容器移動選定的元素
- 5. STL容器元素銷燬順序
- 6. C++ STL容器
- 7. C++ STL關聯容器:從元素獲取迭代器?
- 8. jquery - 檢查元素的類型
- 9. C++ - 如何從STL容器有效的條件刪除元素?
- 10. 將迭代器返回到STL容器中的元素
- 11. Visual C#用lambda表達式檢查數組元素的類型
- 12. C++ STL;迭代包含STL容器的類嗎?
- 13. stl容器中的常量移除元素
- 14. 查找shared_ptr容器中的元素?
- 15. 如何從對象中獲取stl容器的類型?
- 16. C++ STL容器:: clear :: swap
- 17. C#:檢查XML中的重複元素
- 18. 如何檢查Delphi中枚舉的IStorage元素的類型?
- 19. C++中的單一類型和單一元素的通用容器
- 20. 將STL迭代器放在特定類型的元素的任意容器上的函數
- 21. 如何檢查AS3中某個節點的XML元素類型?
- 22. C++:元素類型的元組
- 23. STL容器樣式和指向特定類型的迭代器(C++)
- 24. googletest匹配器檢查容器元素之間的關係
- 25. Visual Studio中的元素檢查器
- 26. STL關聯容器:清除並獲取(不可複製)元素
- 27. 如何檢查C#中輸入(xls)文件的內容類型?
- 28. 是否有STL/boost算法來檢查容器中的所有元素是否與值匹配?
- 29. 什麼是STL容器來執行元素之間的移除?
- 30. 在Windbg中調試C++ STL容器
究竟你在這裏做什麼?由於C++是靜態類型的,因此通常應該知道元素是什麼類型(例如,向量保存整數)。如果你能解釋爲什麼你不知道類型是什麼,以及你想用什麼類型的話,那將有助於回答這個問題。 –
2009-11-10 16:11:10
@David Thornley:'模板 void foo(std :: template arg){/ *在這裏,我們不知道元素類型是什麼* /}'我認爲這是一個很常見的情況。 –
jalf
2009-11-10 16:42:32
@Jalf:在這一點上是真的。但是在那個時候foo()只是一個概念。但只要你使用foo(),你也知道類型。 – 2009-11-10 18:35:48