残念ながら、これは一般的には不可能です。確か
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
は、偶然に、それぞれのイテレータの種類を表し、同じ名前(iterator
)の型定義が含まれているので、typename T::iterator it
はここに働くだろうが、あなたは、このようなtypedefではありませんT
ためfoo
をインスタンス化することができます。標準ライブラリのクラスで
多数の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)は言う:
error: cannot convert __gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > >
to int
in initialization
ない可能性が高いです。 C++ 11ではなく、C++ 11にソフトウェアを移植する傾向があります。 –
タイプがテンプレートパラメータに依存するテンプレート内ではなく、可能でもありません。 – sellibitze
しかし私が知る限り、VisualStudioは、テンプレートパラメータに依存しない限り、マウスで変数にマウスを合わせると型を教えるのに十分スマートです。 – sellibitze