GCC 4.8.0がリリースされると、C ++ 14の一部である自動戻り型の推論をサポートするコンパイラーが提供されます。で-std=c++1y
、これを行うことができます:
auto foo() { //deduced to be int
return 5;
}
私の質問は次のとおりです。いつこの機能を使用すればよいですか?いつそれが必要で、いつコードがよりクリーンになりますか?
シナリオ1
私が考えることができる最初のシナリオは、可能な限りです。このように書くことができるすべての関数はそうあるべきです。これの問題は、コードが読みやすくなるとは限らないことです。
シナリオ2
次のシナリオは、より複雑な戻り値の型を回避することです。非常に軽い例として:
template<typename T, typename U>
auto add(T t, U u) { //almost deduced as decltype(t + u): decltype(auto) would
return t + u;
}
私はそれが本当に問題になるとは思いませんが、戻り値の型を明示的にパラメーターに依存させる方が明確な場合もあります。
シナリオ3
次に、冗長性を防ぐには:
auto foo() {
std::vector<std::map<std::pair<int, double>, int>> ret;
//fill ret in with stuff
return ret;
}
C ++ 11では、時々 return {5, 6, 7};
、ベクトルの代わりに使用ありますが、常に機能するわけではなく、関数ヘッダーと関数本体の両方で型を指定する必要があります。これは完全に冗長であり、自動戻り型の控除により、その冗長性から解放されます。
シナリオ4
最後に、非常に単純な関数の代わりに使用できます。
auto position() {
return pos_;
}
auto area() {
return length_ * width_;
}
ただし、関数を調べて、正確な型を知りたい場合もあります。その型が提供されていない場合は、次のようなコードの別の場所に移動する必要があります。 pos_
は、宣言されてます。
結論
これらのシナリオがレイアウトされている場合、実際にこの機能がコードのクリーン化に役立つ状況であると判明するのはどれですか?ここで言及し忘れたシナリオについてはどうですか?この機能を使用する前に、後で邪魔にならないように、どのような予防策を講じる必要がありますか?この機能がテーブルにもたらす新しいものはありますか?
複数の質問は、これに答える視点を見つける助けとなることに注意してください。
->decltype(t+u)
、自動控除に置き換えるとSFINAEが殺されるとは言われていません。