GCC 4.8.0 yayınlandığında, C ++ 14'ün bir parçası olan otomatik dönüş tipi kesintiyi destekleyen bir derleyicimiz var. İle -std=c++1y
, bunu yapabilirim:
auto foo() { //deduced to be int
return 5;
}
Sorum şu: Bu özelliği ne zaman kullanmalıyım? Ne zaman gereklidir ve ne zaman kodu temizler?
Senaryo 1
Aklıma gelen ilk senaryo mümkün olduğunda. Bu şekilde yazılabilecek her fonksiyon olmalıdır. Buradaki sorun, kodu her zaman daha okunabilir hale getirmeyebilmesidir.
Senaryo 2
Bir sonraki senaryo, daha karmaşık dönüş türlerinden kaçınmaktır. Çok hafif bir örnek olarak:
template<typename T, typename U>
auto add(T t, U u) { //almost deduced as decltype(t + u): decltype(auto) would
return t + u;
}
Dönüş türünün açıkça parametrelere bağlı olması bazı durumlarda daha açık olabileceğini tahmin etsem de, bunun gerçekten bir sorun olacağına inanmıyorum.
Senaryo 3
Sonra, fazlalığı önlemek için:
auto foo() {
std::vector<std::map<std::pair<int, double>, int>> ret;
//fill ret in with stuff
return ret;
}
C ++ 11'de bazen sadece return {5, 6, 7};
bir vektörün yerine geçebiliriz , ancak bu her zaman işe yaramaz ve hem işlev üstbilgisinde hem de işlev gövdesinde türü belirtmemiz gerekir. Bu tamamen gereksizdir ve otomatik dönüş tipi kesinti bizi bu fazlalıktan kurtarır.
Senaryo 4
Son olarak, çok basit fonksiyonların yerine kullanılabilir:
auto position() {
return pos_;
}
auto area() {
return length_ * width_;
}
Bununla birlikte, bazen, tam türü bilmek isteyen işleve bakabiliriz ve orada sağlanmazsa, kodda nerede pos_
bildirildiği gibi başka bir noktaya gitmeliyiz .
Sonuç
Bu senaryolar ortaya konduğunda, hangisi aslında bu özelliğin kodu daha temiz hale getirmede yararlı olduğu bir durum olduğunu kanıtlıyor? Burada bahsetmeyi ihmal ettiğim senaryolar ne olacak? Beni daha sonra ısırmaması için bu özelliği kullanmadan önce ne gibi önlemler almalıyım? Bu özelliğin masaya onsuz getiremediği yeni bir şey var mı?
Birden fazla sorunun bunun yanıtlanacağı perspektifleri bulmada yardımcı olması gerektiğini unutmayın.
->decltype(t+u)
, otomatik kesinti ile değiştirmenin SFINAE'yi öldürdüğünden bahsetmiyor gibi görünüyor .