2012-01-20 10 views
11

「auto」の各インスタンスをコンパイラ推論型に置き換えるスクリプト、プラグイン、または実行可能ファイルを作成した人はいますか?私は、どこでもautoを使うC++ 11コードを移植する必要があります。自動キーワードを演繹型(clangまたはVS2010)に置き換えます。

Clangが私の最初の候補です。誰かがこれのようなことをするためにそれを修正しましたか?

代わりに、予想される型がエラー出力にある可能性があるため、コンパイラからのエラーを解析することもできます。私は-Dauto=intでき、おそらく戻ってくる"could not convert std::vector<int>::iterator to 'int'"

+5

ない可能性が高いです。 C++ 11ではなく、C++ 11にソフトウェアを移植する傾向があります。 –

+0

タイプがテンプレートパラメータに依存するテンプレート内ではなく、可能でもありません。 – sellibitze

+1

しかし私が知る限り、VisualStudioは、テンプレートパラメータに依存しない限り、マウスで変数にマウスを合わせると型を教えるのに十分スマートです。 – sellibitze

答えて

8

残念ながら、これは一般的には不可能です。確か

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::mapstd::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

関連する問題