SORU
11 HAZİRAN 2009, PERŞEMBE


C SFİNAE örnekler?

Daha fazla şablon meta-programlama içine almak istiyorum. Bu SFİNAE "ikame bir hata değildir." demektir biliyorum Ama biri bana SFİNAE için iyi bir kullanım gösterebilir?

CEVAP
12 HAZİRAN 2009, Cuma


SFINAE boolean durumunu kontrol etmek için kullanmayı seviyorum.

template<int I> void div(char(*)[I % 2 == 0] = 0) {
    /* this is taken when I is even */
}

template<int I> void div(char(*)[I % 2 == 1] = 0) {
    /* this is taken when I is odd */
}

Oldukça kullanışlı olabilir. Örneğin, başlatıcı liste operatör virgül kullanarak toplanan sabit bir boyutu daha uzun olup olmadığını kontrol etmek için kullandım

template<int N>
struct Vector {
    template<int M> 
    Vector(MyInitList<M> const& i, char(*)[M <= N] = 0) { /* ... */ }
}

Liste sadece M başlatıcı listesi de pek çok unsur vardır ki, N, daha küçük olduğunda kabul edilir.

char(*)[C] sözdizimi anlamı: eleman türü char ve boyutu ile bir dizi için İşaretçi C. Eğer C yanlış (0) ise, char(*)[0] sıfır boyutlu dizi için işaretçi geçersiz adamı sonra: SFİNAE şablon sonra. göz ardı edilecektir.

Bu gibi görünüyor boost::enable_if ile dile getirdi

template<int N>
struct Vector {
    template<int M> 
    Vector(MyInitList<M> const& i, 
           typename enable_if_c<(M <= N)>::type* = 0) { /* ... */ }
}

Uygulamada, sık sık durumunu kontrol etmek için yeteneği yararlı bir yetenek bulmak.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • BroadCity

    BroadCity

    10 ŞUBAT 2010
  • CodingMadeEasy

    CodingMadeEa

    25 EYLÜL 2010
  • DragsterMC Gaming

    DragsterMC G

    30 HAZİRAN 2013