SORU
14 Mayıs 2014, ÇARŞAMBA


Üye işlevi olan bir tür için bir kavram belirtme şablonu Kavramları Lite kullanarak

Üye işlevi bir şablon Kavramlar Lite kullanarak yüksek kinded bir tür sınırlamak için bir konsept belirlemek için çalışıyorum. Ancak technical specification içeride ya da bir fıkra şablonu esas alan ifadeleri ile ilgili bir kavram içinde tutorial bulunamam.

Bu nasıl yapılıyor?

Örnek: yüksek kinded türüne sahip bir üyesi şablon F: fonksiyonu ile HKT sanırım

template<class T>
struct HKT {
  template<class U> // this looks like e.g. rebind in std::allocators
  auto F(U) -> HKT<U>;
};

ve şimdi bu yüksek kinded tür kısıtlayıcı bir kavram belirtmek istiyorum:

template <template <class> class HKT, class T>
concept HKTWithTemplateMemberFunctionF {
  return requires(HKT<T> h) { // HKT<T> is a type, h is an object
    // HKT<T> needs to have a member function template that 
    // returns HTK<U> where the type U is to be deduced and
    // it can be any type (it is unconstrained)
    template<class U>  // is there a syntax for this?
    h.F(std::declval<U>()) -> HKT<U>; 
  }
}

Gibi bir şey yapabilirim not:

template <template <class> class HKT, class T, class U>
concept HKTWithTemplateMemberFunctionF {
  return requires(HKT<T> h) {
      h.F(std::declval<U>()) -> HKT<U>;
  }
}

ama bu kısıtlama sitesinde U bilmem gerektiği anlamına gelir.

Bilmiyorum gerçekten önemsiyorsan değişimi için verilen U başarısız olur ya da olmasa da neden bu bir sorun olabilir: örneğin, geçerli bir kısıtlaması var olmak emin çalışmıyor başarısız ve başarısız neden kısıtlaması olduğunu memnun ama örnekleme zaman değiştirme başarısız oldu üye işlev şablonu (işe yarar mıydı üye işlevi şablon oldu kısıtlı?).

CEVAP
17 Aralık 2014, ÇARŞAMBA


Uzun lafın kısası, şu an sizin (?) U özel: sağlamak zorunda

template <template <class> class HKT, class T, class U = T>
concept HKTWithTemplateMemberFunctionF {
  return requires(HKT<T> h) { // HKT<T> is a type, h is an object
    h.F(std::declval<U>()) -> HKT<U>; 
  }
}

derleyici olamaz hiç üye işlev şablonu çalışacak olabilecek her türlü U ispat yılından aşağıdaki umutsuz:

template <template <class> class HKT, class T>
concept HKTWithTemplateMemberFunctionF {
  return requires(HKT<T> h) {
    template<class U>  // for all those Us that haven't been written yet...
    h.F(std::declval<U>()) -> HKT<U>; 
  }
}

U sınırlamak için mümkün olduğu bir varsayımsal tasarlanmış--5 dakika içinde kavramlar-lite uygulanmasıparça parça sadece:

template <template <class> class HKT, class T, 
          InputIterator U = InputIterator()  /* imaginary syntax */ >
concept HKTWithTemplateMemberFunctionF {
  return requires(HKT<T> h) {
      h.F(std::declval<U>()) -> HKT<U>; // Is InputIterator enough to instantiate F?
  }
}

derleyici yalnızca InputIterator modeli h.F kısıtlı değilse bile mümkündür h.F, oluşturmaya yeterli olup olmadığını kontrol etmek gerekir! Ayrıca bu InputIterator beri ** 23, bile U h.F kontrol etmeye gerek modeller U kontrol sağlayan yeterli. Bu derleme zamanı performans ve... optimize etmek için kullanılabilir

...muhtemelen SFİNAE ile şaşırtıcı bir şekilde etkileşim olacaktır, AFAIK bu yana tüm giriş kullanımına kabul eden kavram-aşırı fonksiyon (InputIterator gibi) olabilirşu hariç(SFİNAE! bunu neden yapsınlar?!), ve böylece kavram-kontrol pas ama örnekleme zaman darbe olabilir... üzücü.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • bethliebert

    bethliebert

    23 EKİM 2008
  • eurotuner

    eurotuner

    6 Mart 2006
  • hockeywebcasts

    hockeywebcas

    31 EKİM 2012