如何从对象中获取stl容器的类型

How to get the type of stl container from object?

本文关键字:类型 stl 获取 对象      更新时间:2023-10-16

如何从对象中获取STL容器的类型?例如,我有一个container变量,我知道它是std::vector<some type>。我需要使用迭代器对容器进行迭代。有没有一种方法可以在不知道容器类型的情况下声明迭代器?

当然,我可以从代码中获得类型,但我很好奇不使用类型就可以做到这一点。此外,我没有使用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)
    // ... 

您还有迭代器typedef(可以使用它来代替const_iterator(。如果您使用的是c++11,请使用auto或for(auto& value: container) { ... }形式。

从类型中获取

container::value_type.

对于关联容器;container::mapped_type(container::value_type对应于对(。它是根据C++标准的第23章。

使用boost::is_same比较类型

从对象实例获取:

auto it = container.begin();

一种方法是使用模板:

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中可用。