2

オブジェクトからSTLコンテナのタイプを取得するには? たとえば、container変数があり、それが であることを知っていますstd::vector<some type>。イテレータを使用してコンテナを反復処理する必要があります。コンテナの型を知らずにイテレータを宣言する方法はありますか?

もちろん、コードから型を取得できますが、型を使用せずにそれを行うことに興味があります。また、私は C++11 を使用していません。

4

4 に答える 4

9

C ++ 11には、いくつかの簡単な方法があります。

auto it = container.begin();

または同等に:

decltype(container.begin()) it = container.begin();

あるいは:

decltype(container)::iterator it = container.begin();

それでも、型控除を使用できない場合でも、何らかの形式(おそらくテンプレートパラメーターを含む)で型を入力できない状況になることはありません。コンパイラがそれがどんなタイプであるかを知っているなら、あなたもそうします。

于 2013-03-21T14:50:05.163 に答える
2
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) { ... }フォームを使用してください。

于 2013-03-21T14:48:08.323 に答える
1

タイプから取得するには:

container::value_type.

連想コンテナの場合。container::mapped_type(container :: value_typeはペアに対応します)。これは、C++標準の第23章に準拠しています。

boost::is_sameを使用してタイプを比較します

オブジェクトインスタンスから取得するには:

auto it = container.begin();
于 2013-03-21T14:49:55.833 に答える
0

1つの方法は、テンプレートを使用することです。

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で使用できます。

于 2013-03-21T14:50:40.980 に答える