1

orのような特定の stl コンテナの入力引数としてC++11any を受け入れる関数で作成することは可能ですか?iteratorvectorlist

のようなものを書きたい

void f(iterator<int> i){
   for (auto el : i)
      cout << el;
}
int main(){
   vector<int> v;
   list<int> l;
   ...
   f(v);
   f(l);
}

出来ますか?

4

4 に答える 4

3

for (auto i: cont)関数で反復子を受け入れる場合は、構文を使用できません。実際、この新しい範囲ベースの for 構文は、反復子ではなくコンテナーを必要とします。

次に、コンテナーを渡して、関数を簡単に関数テンプレートにすることができます。

template <class CONT>
void f(CONT &cont){
    for (auto el : cont)
        cout << el;
}

イテレータを渡し続けたい場合は、テンプレートの方法も使用する必要がありますが、引数として 2 つのイテレータを渡す必要があります。1 つは最初のもの、もう 1 つは最後 (のようにalgorithm) です。

template <class IT>
void f(IT first, IT last) {
    for ( ; first!=last ; ++first)
        cout << first;
}
于 2012-11-19T16:17:48.093 に答える
2

いいえ。任意のイテレータをパラメーターとして受け入れる関数テンプレートを作成できますが、関数は作成できません。

イテレータの型消去を行うクラスがある場合は、それをパラメータとして使用できます。iterator type erase の記事とコードは次のとおりです。

于 2012-11-19T16:09:57.873 に答える
1

どこかに boost::any_iterator があります。しかし、標準はそれを提供していません。

于 2012-11-19T16:09:52.597 に答える