我怎樣才能得到由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. STL容器插入元素
- 2. 容器元素類型
- 3. stl容器中的搜索元素
- 4. 檢查Visual Studio 2015中的STL容器
- 5. C++模板 - 指定容器類型和它容納的容器元素類型
- 6. 回到STL容器元素的參考
- 7. STL容器移動選定的元素
- 8. STL容器元素銷燬順序
- 9. 向STL容器背面添加元素
- 10. C++ STL容器
- 11. STL中的容器C++
- 12. 使用元素鍵迭代STL容器
- 13. C++ STL關聯容器:從元素獲取迭代器?
- 14. 檢查元素中的類
- 15. C++ - 如何從STL容器有效的條件刪除元素?
- 16. jQuery:檢查SVG元素的類型
- 17. jquery - 檢查元素的類型
- 18. 對C++ STL類型
- 19. 將迭代器返回到STL容器中的元素
- 20. Eclipse CDT無法解析STL容器中元素的方法
- 21. 使用std :: remove_reference獲取STL容器的元素迭代器
- 22. 如何檢查元素類型?
- 23. JavaScript檢查元素輸入類型onclick
- 24. Visual C#用lambda表達式檢查數組元素的類型
- 25. C++ STL;迭代包含STL容器的類嗎?
- 26. 序列化任意類型的STL容器(包括其他容器)C++
- 27. 查找windbg中stl deque的元素數
- 28. 移動STL容器中的元素是否將其從該容器中移除?
- 29. C++ stl關聯容器和用戶定義類型
- 30. 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