残念ながら、これは一般的なケースでは不可能です。検討:
template <typename T> void foo(T & t)
{
auto it = t.find(42);
...
}
...
std::map<int, int> m;
std::set<int> s;
...
foo(m);
foo(s);
確かに無意味な例ですが、テンプレート引数に依存している場合、 auto を何に置き換えるかを知る方法がないことを示しています。 std::map
ちなみに、とには、それぞれの反復子の型を表すstd::set
同じ名前 ( ) の typedef が含まれているため、ここでは機能しますが、そのような型定義を持たないに対してインスタンス化できます。iterator
typename T::iterator it
foo
T
標準ライブラリ クラスの多数の typedef は、そのようなテンプレートauto
が発明/再利用される前に記述できるようにするために正確に追加されましたauto
。しかし、少なくともauto
コンパイラにサポートを追加するのに匹敵する努力なしでは、自動化できるものではありません...
auto
テンプレートの種類に依存しない場合でも、ユーザーにとって意味があり、移植可能なものに置き換えるのは難しい問題です。取った:
std::map<int, int> m;
auto it = m.find(42);
の妥当な置き換えはauto
ですが、コンパイラのエラー メッセージstd::map<int, int>::iterator
を使用-Dauto=int
して見ると、 のようなものに置き換えますstd::_Rb_tree_iterator<std::pair<const int, int> >
。これは標準ライブラリの実装の詳細であり、読みにくく、明らかに移植性がありません。コードにそれは必要ありません。
あなたの例では、私のコンパイラ(GCC 4.4.6)は次のように言っています:
エラー:初期化で変換__gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > >
できませんint