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

  • Helen Bradley

    Helen Bradle

    4 Mart 2008
  • Neil Cicierega

    Neil Ciciere

    22 Mart 2006
  • NewsyTech

    NewsyTech

    2 AĞUSTOS 2010