SORU
1 NİSAN 2013, PAZARTESİ


C 14 otomatik geri dönüş tipi kesintinin kullanmalıyım?

GCC 4.8.0 bilgi yayımladı, otomatik geri dönüş tipi kesinti, C 14 parçası destekleyen bir derleyici var. -std=c 1y, ile bunu yapabilirim:

auto foo() { //deduced to be int
    return 5;
}

Benim sorum: bu özelliği ne Zaman kullanmalıyım? Ne zaman gerekli mi ve ne zaman kod temizleyici eder mi?

Senaryo 1

Aklıma ilk senaryo mümkün. Bu şekilde yazılan her fonksiyonu olmalıdır. Bu sorun her zaman kodu daha okunaklı hale getirebilir.

Senaryo 2

Bir sonraki senaryo daha karmaşık dönüş türleri kaçınmaktır. Çok açık 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;
}

Gerçekten dönüş türü açıkça parametreleri daha net olabilir bağlı olması bazı durumlarda sanırım, bir sorun olacağını sanmıyorum.

Senaryo 3

Sonraki, fazlalık önlemek için:

auto foo() {
    std::vector<std::map<std::pair<int, double>, int>> ret;
    //fill ret in with stuff
    return ret;
}

C 11, bazen sadece return {5, 6, 7}; yer vektörü, ama bu değil her zaman işe ihtiyacımız belirtmek yazın her iki işlevi başlığı ve işlevi vücudun. Bu tamamen gereksiz ve otomatik geri dönüş tipi kesintinin bu fazlalık bizi kurtarır.

Senaryo 4

Son olarak, çok basit işlevleri yerine kullanılabilir:

auto position() {
    return pos_;
}

auto area() {
    return length_ * width_;
}

Bazen, ama, olabilir bak işlevi, istemek, bilmek tam yazın ve eğer değil sağlanan, biz gitmek için başka bir kod gibi pos_ olduğunu ilan etti.

Sonuç

Bu senaryoları ortaya koydu, bunların aslında bu özellik kod temizleyici yapmak yararlı olduğu bir durum olduğunu kanıtlayabilir? Ne senaryolar hakkında ben burada bahsetmeyi ihmal var mı? Ben kendime dikkat sonra beni ısırmıyor bu özelliği kullanmadan önce ne yapmalıyım? Yeni bir şey bu, o olmadan mümkün değil masaya getiriyor özelliği var mı?

Birden çok soru bu cevap için perspektifler bulma yardımcı olmak içindir unutmayın.

CEVAP
1 NİSAN 2013, PAZARTESİ


Lambda dönüş türü indirimi ne zaman kullanılır, ve auto değişkenleri kullanma. C 11 benzer soruları gündeme getiriyor:

C ve C 03 soruya geleneksel cevap olmuştur "ifadesi sınırlarında türleri açık, genellikle örtülü olduklarını ifade içinde olduk ama onları atmalarını açık hale getirebiliriz". Ve C 1y C 11 yeni yerlere türü dışında bırakabilirsiniz böylece tür kesintinin araçları tanıtmak.

Üzgünüm, ama bu ön genel kuralları yaparak çözmek için gidiyoruz. İhtiyacın bakmak için belirli kod ve karar vermek için kendine mi, yoksa aıds okunabilirlik belirtmek türleri hem de nasıl: daha iyi kod için, "türü bu şey X", ya da daha iyi için kodunuzu ki: "yazın bu şey alakasız anlayış bu bölüm kodu: derleyici bilmen gereken birşey var ve biz işin içinden çıkar ama gerek yok ki burada"?

Beri "okunabilirlik" değildir nesnel olarak tanımlanmıştır [*] ve dahası değişir okuyucu tarafından, bir sorumluluk olarak yazar/editör bir parça kod olamaz tamamen tatmin olmuş bir stil rehberi. Hatta bir stil rehberi normları, farklı insanlar, farklı normları tercih eder belirtin ve hiç bir şey bilmediğiniz bulmak eğiliminde olacaktır ölçüde "daha okunabilir". Özellikle önerilen bir tarzı okunabilirlik kural genellikle tek bir yerde diğer stil kuralları çerçevesinde değerlendirilebilir.

Tüm senaryolarınız (hatta ilk) birinin kodlama stili için kullanmak bulabilirsiniz. Şahsen en zorlayıcı kullanma durumu ikinci buluyorum, ama öyle olsa bile Dokümantasyon araçları bağlı bekliyorlar. Değil çok yararlı görmek belgelenmiş dönüş türü bir işlev şablonu auto, oysa görmek belirtildiği gibi decltype(t u) oluşturur yayınlanan arabirim (umarım) güveniyor.

[*] Bazen birinin bazı objektif Ölçümler yapmaya çalışır. Küçük ölçüde olan kimse ile geliyor herhangi bir istatistiksel olarak anlamlı ve genel olarak uygulanabilir sonuçlar, onlar tamamen göz ardı ederek çalışan programcılar, lehine yazar içgüdü nedir "okunabilir".

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Chuck Testa

    Chuck Testa

    14 AĞUSTOS 2011
  • makemebad35

    makemebad35

    17 NİSAN 2006
  • tychoadragmire

    tychoadragmi

    20 Mart 2006