如何从一个对象中获取STL容器的类型?例如,我有一个container
变量,我知道它是std::vector<some type>
。我需要使用迭代器迭代容器。有没有办法在不知道容器类型的情况下声明迭代器?如何从对象中获取stl容器的类型?
我可以从代码当然得到类型,但我很好奇不使用类型。另外我不使用C++ 11。
如何从一个对象中获取STL容器的类型?例如,我有一个container
变量,我知道它是std::vector<some type>
。我需要使用迭代器迭代容器。有没有办法在不知道容器类型的情况下声明迭代器?如何从对象中获取stl容器的类型?
我可以从代码当然得到类型,但我很好奇不使用类型。另外我不使用C++ 11。
C++ 11有一些不错的简单的方法:
auto it = container.begin();
或等价:
decltype(container.begin()) it = container.begin();
甚至:
decltype(container)::iterator it = container.begin();
不过,即使你不能使用类型推演,你不应该在一个情况下,你不能以某种形式打出来的类型或其他(可能涉及模板参数) 。如果编译器知道它是什么类型,那么你也是。
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) { ... }
表单。
这并没有真正回答这个问题,但问题通常是如何解决的。 – 2013-03-21 14:50:34
从类型得到它:
container::value_type.
关联容器; container::mapped_type
(container :: value_type对应于pair)。它是根据C++标准的第23章。
使用boost::is_same比较类型
从对象实例得到它:
auto it = container.begin();
':: value_type'只适用于类型,不适用于对象。 – 2013-03-21 14:51:51
OP想要获取元素的类型,对不对? – 4pie0 2013-03-21 14:53:33
来自容器的一个实例。 – juanchopanza 2013-03-21 14:55:00
一种方法是用一个模板:
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中。
'auto'就是这样! – 2013-03-21 14:46:33
你可以显示一些代码,你使用“某些类型”的“std :: vector”吗? – LihO 2013-03-21 14:48:43
你可以显示一些代码来说明你遇到的问题。如果你有一个接受'container'作为参数的函数,那么类型必须包含 - 除非它是一个模板,但即使在这种情况下,你也可以使用SFINAE来获得你所需要的。 – Chad 2013-03-21 14:48:50