Dengan GCC 4.8.0 dirilis, kami memiliki kompiler yang mendukung pengurangan tipe pengembalian otomatis, bagian dari C ++ 14. Dengan -std=c++1y
, saya bisa melakukan ini:
auto foo() { //deduced to be int
return 5;
}
Pertanyaan saya adalah: Kapan saya harus menggunakan fitur ini? Kapan itu perlu dan kapan itu membuat kode lebih bersih?
skenario 1
Skenario pertama yang bisa saya pikirkan adalah kapanpun memungkinkan. Setiap fungsi yang dapat ditulis dengan cara ini seharusnya. Masalah dengan ini adalah bahwa itu mungkin tidak selalu membuat kode lebih mudah dibaca.
Skenario 2
Skenario berikutnya adalah menghindari tipe pengembalian yang lebih kompleks. Sebagai contoh yang sangat ringan:
template<typename T, typename U>
auto add(T t, U u) { //almost deduced as decltype(t + u): decltype(auto) would
return t + u;
}
Saya tidak percaya itu akan benar-benar menjadi masalah, meskipun saya kira memiliki tipe pengembalian secara eksplisit tergantung pada parameter bisa lebih jelas dalam beberapa kasus.
Skenario 3
Selanjutnya, untuk mencegah redundansi:
auto foo() {
std::vector<std::map<std::pair<int, double>, int>> ret;
//fill ret in with stuff
return ret;
}
Dalam C ++ 11, kadang-kadang kita hanya bisa return {5, 6, 7};
menggantikan vektor, tetapi itu tidak selalu berhasil dan kita perlu menentukan tipe di header fungsi dan fungsi tubuh. Ini murni berlebihan, dan pengurangan tipe pengembalian otomatis menyelamatkan kita dari redundansi itu.
Skenario 4
Akhirnya, dapat digunakan sebagai pengganti fungsi yang sangat sederhana:
auto position() {
return pos_;
}
auto area() {
return length_ * width_;
}
Namun, kadang-kadang, kita mungkin melihat fungsinya, ingin tahu tipe yang tepat, dan jika tidak disediakan di sana, kita harus pergi ke titik lain dalam kode, seperti di mana pos_
dinyatakan.
Kesimpulan
Dengan skenario yang ditetapkan, yang mana di antara mereka yang benar-benar terbukti sebagai situasi di mana fitur ini berguna dalam membuat kode lebih bersih? Bagaimana dengan skenario yang saya lupa sebutkan di sini? Peringatan apa yang harus saya ambil sebelum menggunakan fitur ini agar tidak menggigit saya nanti? Apakah ada sesuatu yang baru yang dibawa fitur ini ke meja yang tidak mungkin tanpanya?
Perhatikan bahwa banyak pertanyaan dimaksudkan sebagai bantuan dalam menemukan perspektif untuk menjawab ini.
->decltype(t+u)
dengan pengurangan otomatis membunuh SFINAE.