13

「auto」の各インスタンスをコンパイラによって推定される型に置き換えるスクリプト、プラグイン、または実行可能ファイルを作成した人はいますか? どこでも auto を使用する C++11 コードを移植する必要があります。

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

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

4

1 に答える 1

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::mapちなみに、とには、それぞれの反復子の型を表すstd::set同じ名前 ( ) の typedef が含まれているため、ここでは機能しますが、そのような型定義を持たないに対してインスタンス化できます。iteratortypename T::iterator itfooT

標準ライブラリ クラスの多数の 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

于 2012-01-20T17:59:25.553 に答える