2013-03-21 42 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中。