SORU
28 Ocak 2015, ÇARŞAMBA


"Tembel adam 'enable_if"yasal C" mi ?

Ben sık sık "tembel adam enable_if," decltype ve virgül operatörünün bazı şablon giriş dayalı bir işlevi etkinleştirmek için kullanın. benim tekniği kullan İşte küçük bir örnek:

template <typename F>
auto foo(F&& f) -> decltype(f(0), void())
{
    std::cout << "1" << std::endl;
}

template <typename F>
auto foo(F&& f) -> decltype(f(0, 1), void())
{
    std::cout << "2" << std::endl;
}

--std=c 11 ve Çınlama 3.5 g 4.7 ile mutlu bir kod bit (ve ben beklediğiniz gibi çalışır) derleme. MSVC 14 CTP5, bu hata foo önceden tanımlanmış şikayet alıyorum kullanırken ancak,:

Hata hata C2995: '-türü bilinmeyen foo(F &&)': işlev şablonu vardır önceden tanımlanmış c -çizik main.cpp 15

Benim sorum ise şu: "tembel adam enable_if" C veya bu MSVC bir hata yasal mı?

CEVAP
28 Ocak 2015, ÇARŞAMBA


Sonunda bir dönüş türü (varsa) geri işlevi, bir beyana göre [malzeme.türüdür fct] 2/:

Bir bildiri 11 *şeklinde olduğu* 10*

D1 (parametre bildirimi madde)cv-niteleyici seqopt ref-niteleyicioptdurum belirtimioptöznitelik-belirtici-seqopt sondaki-dönüş-tür

ve bu tür içeriyorduBildiricisi-ıdBildirgesi T D1-Bildiricisi tipi türetilmiş listesi”, T tek olacaktırT türü belirleyicisi auto. Bu türüBildiricisi-ıdD içinde “-Bildiricisi tipi türetilmiş listesiişlevibu (parametre bildirimi madde)cv-niteleyici seqopt ref-niteleyicioptdönüyorsondaki-dönüş-tür”.

Şimdi [temp.üzerinde.link]/6 iki işlev şablonu bildirimleri aşırı olduğunda belirtir. Bu aşağıdaki gibi iki işlev şablonları denklik tanımlayarak yapılır

İki işlev şablonları vardıreşdeğereğer onlar [..] kuralları kullanarak eşdeğerdir dönüş türleri [..] varsa ifadeler şablon parametreleri içeren karşılaştırmak için yukarıda açıklanan.

Şimdi standart iki dönüş türleri farklı olduğunda belirtir kısma geldik. "Kuralları yukarıda açıklanan"

İki ifadeyi şablon parametreleri içeren kabul edilir eşdeğereğer iki fonksiyon tanımlarını içeren ifadeler bir tanım kuralı (3.2) [ .. ] tatmin eder

O) bu kısmı Birleşik Devletleri için ilgili [temel.def.DDR]/6

Böyle bir varlık D adında birden fazla çeviri tanımlanmış belirli birim, o zaman

  • D Her tanımlama belirteçleri aynı sıra oluşacaktır;

Açıkça ifade iki işlevi tanımlar bu ifadeleri içeren) ihlal edecek böylece aynı simgeleri içerir.
Dolayısıyla foo bildirimleri olmayan eşdeğer işlev şablonları ve aşırı adını bildirin.

Gördüğünüz hata ifade SFİNAE VC destek eksikliği nedeniyle verilen - muhtemelen-iade-tip sondaki denklik için yerine getirilir.


Geçici çözüm

İşlev şablonları olmayan eşdeğer başka bir şekilde yapmak-şablon parametre listesi Değiştirebilirsiniz. Senin gibi ikinci tanımını yeniden yazmak:

template <typename F, int=0>
auto foo(F&& f) -> decltype(f(0, 1), void())
{
    std::cout << "2" << std::endl;
}

Sonra compiles it fineVC. Ben kısaltılmış alıntı [temp.üzerinde.bu kapsar: link]/6,

İki işlev şablonları vardıreşdeğereğer aynı ilan ise kapsamı, aynı ismi taşıyoraynı şablon parametre listeleri var[..]

Aslında, kolayca Yeni aşırı tanıtmak edebilmek için küçük bir yardımcı kullanabilirsiniz:

template <int I>
using overload = std::integral_constant<int, I>*;

Kullanım örn

// Remember to separate > and = with whitespace
template <typename... F, overload<0> = nullptr>
auto foo(F&&... f) -> decltype(f(0, 1)..., void())

template <typename... F, overload<1> = nullptr>
auto foo(F&&... f) -> decltype(f(0, 1, 2)..., void())

Demo.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Caramella Girls

    Caramella Gi

    19 Mayıs 2008
  • MyCyberAcademy

    MyCyberAcade

    2 EKİM 2011
  • SignatureSeries

    SignatureSer

    24 Aralık 2006

İLGİLİ SORU / CEVAPLAR