SORU
30 Ocak 2013, ÇARŞAMBA


Neden std kaçınmalısınız::enable_if işlev imzaları

Scott Meyers sonraki kitabı content and status AT 11 gönderildi. Kitapta bir öğe olabileceğini yazdı":: enable_if Önlemek std işlevi imza".

std::enable_if sınıf şablon olarak dönüş türü olarak işlev bir değişken olarak kullanılabilir, ya ya da şablon parametre şartlı aşırı çözümleme işlevleri veya sınıfları kaldırmak için işlevi.

this question Her üç çözüm gösterilir.

Olarak işlev parametre:

template<typename T>
struct Check1
{
   template<typename U = T>
   U read(typename std::enable_if<
          std::is_same<U, int>::value >::type* = 0) { return 42; }

   template<typename U = T>
   U read(typename std::enable_if<
          std::is_same<U, double>::value >::type* = 0) { return 3.14; }   
};

Şablon parametre:

template<typename T>
struct Check2
{
   template<typename U = T, typename std::enable_if<
            std::is_same<U, int>::value, int>::type = 0>
   U read() { return 42; }

   template<typename U = T, typename std::enable_if<
            std::is_same<U, double>::value, int>::type = 0>
   U read() { return 3.14; }   
};

Dönüş türü:

template<typename T>
struct Check3
{
   template<typename U = T>
   typename std::enable_if<std::is_same<U, int>::value, U>::type read() {
      return 42;
   }

   template<typename U = T>
   typename std::enable_if<std::is_same<U, double>::value, U>::type read() {
      return 3.14;
   }   
};
  • Hangi çözümü tercih edilmeli ve neden Diğerleri kaçınmalısınız?
  • Hangi durumlarda ":: enable_if Önlemek std" endişeleri dönüş türü ama şablon uzmanlık normal işlev imzası olan () kullanımı? işlev imzaları
  • Üye ve üye olmayan işlev şablonları için herhangi bir fark var mı?

CEVAP
31 Ocak 2013, PERŞEMBE


Şablon parametreleri hack koyun.

Şablon parametre yaklaşım enable_if diğerleri üzerinde en azından iki avantajı vardır:

  • okunabilirlik: enable_if kullanımı ve iade/değişken türleri birleştirilmiş içine dağınık bir yığın typename disambiguators ve iç içe türü erişir; bile karmaşası ve disambiguator ve iç içe türü olabilir hafifletilmiş olan diğer şablonlar, hala birleştirme alakasız iki şeyi bir arada. Enable_if kullanımı dönüş türleri için şablon parametreleri ile ilgilidir. Şablon olarak parametreleri önemli olan şeylere daha yakın olduğu anlamına gelir;

  • evrensel uygulanabilirliği: kurucular dönüş türleri ve bazı operatörler diğer iki seçenek de her yerde uygulanabilir çok fazla argüman var. Şablon parametresi enable_if koyarak sadece şablonlarda SFİNAE yine de kullanabilirsiniz beri her yerde çalışır.

Benim için, okunabilirlik yönüyle bu seçim büyük motive edici bir faktördür.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Jonathan D.

    Jonathan D.

    3 Kasım 2006
  • karneson

    karneson

    23 Temmuz 2006
  • maxman.tv

    maxman.tv

    29 EKİM 2013