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

  • David Wills

    David Wills

    31 Aralık 2007
  • SRI International

    SRI Internat

    30 NİSAN 2008
  • The Pet Collective

    The Pet Coll

    5 Ocak 2012