SORU
28 EYLÜL 2011, ÇARŞAMBA


Neden'otomatik olarak dönüş türleri seçtiğini tespit ettik mi?

Son zamanlarda daha Haskell, C-y, ve temelde bu gibi bir işlevi istedik yapmak isteyen bir arkadaşım çalışıyordu:

auto sum(auto a, auto b) {
    return a   b;
}

Görünüşe göre bu şekilde değiştirdim çok parametre türü olarak otomatik kullanamam:

template<class A, class B>
auto sum(A a, B b) {
    return a   b;
}

Ama bu da işe yaramıyor. Bizim buna ihtiyacımız var sonuçta ne fark ettim:

template<class A, class B>
auto sum(A a, B b) -> decltype(a   b) {
    return a   b;
}

Yani benim soru, ne anlamı var? Derleyici sadece return deyimi bakabilir beri mi decltype tekrar bilgi değil mi?

Belki de sadece bir başlık dosyası vardır, böylece ihtiyaç olduğunu düşündüm:

template<class A, class B>
auto sum(A a, B b) -> decltype(a   b);

... ama böyle şablonlar zaten kullanamayız.

Düşündüm başka bir şey derleyici için daha kolay olacağını düşünüyorlar, ama aslında daha zor olacak gibi görünüyor.

Durum 1: decltype

  • decltype tablo türünü anlamaya
  • Herhangi bir geri dönüş değerlerinin türlerini anlamak
  • Eğer onlar Maç olmadığını görmek

decltype Olmadan . Durum 2:

  • Herhangi bir geri dönüş değerlerinin türlerini anlamak
  • Eğer onlar Maç olmadığını görmek

Akılda bu şeyler ile, sondaki nokta decltype ile döndürme türü nedir?

CEVAP
28 EYLÜL 2011, ÇARŞAMBA


Eğer aşağıdaki:

template<class A, class B, class C>
auto sum(A a, B b, C c) {
   if (rand () == 0) return a   b;

   // do something else...

    return a   c;
}

a b a c ifadeler nerede .. sonuçlar farklı türü verim. Derleyici dönüş türü için koymaya karar olduğunu ve neden işlevi ne olmalıdır? Bu durumda zaten kapsadığı C 11 Lambda vermek için ihmal dönüş türü sürece return ifadeler olabilir sonucuna aynı tip (NB standart alıntı gereken bazı kaynaklarda iddia sadece bir "dönüş" ifadesidir izin ve bu gcc glitch).


Teknik bir sebebi C tanımı ve bildirimi ayrı olmak üzere ikiye ayrılır.

template<class A, class B>
auto sum(A a, B b) -> decltype(a   b);

template<class A, class B>
auto sum(A a, B b) -> decltype(a   b)
{
}

Şablon tanımıolabilirbaşlığında. Ya da bir arabirim üzerinden bakıldığında işlev tanımları ve sayfa sayfa taramak zorunda değilsiniz, böylece başka bir dosya olabilir.

C tüm olasılıkları hesaba sahiptir. Sonunda dönüş türleri sadece tanımları fonksiyonu kısıtlayan bir şey bu kadar kolay yapamazsın anlamına gelir:

template<class A, class B>
class Foo
{
  auto sum(A a, B b) -> decltype(a   b);
}

template<class A, class B>
auto Foo<A, B>::sum(A a, B b) -> decltype(a   b)
{
}

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Adam Washington

    Adam Washing

    12 Mayıs 2006
  • Alexander Johnson

    Alexander Jo

    26 Temmuz 2008
  • TheOtherMau5

    TheOtherMau5

    6 Mart 2012