SORU
7 AĞUSTOS 2011, Pazar


::enable_if std şartlı üye işlev derleme

Çalışmak için basit bir örnek almak için std::enable_if kullanmak için nasıl anlamaya çalışıyorum. this answer, okuduktan sonra çok zor basit bir örnek ile gelip olmamalı diye düşündüm. std::enable_if iki üye işlevleri arasında seçim yapmak için kullanın ve sadece bir tanesi kullanılmasına izin istiyorum.

Ne yazık ki, aşağıdaki hata nedir arkadaşlar soruyorum çalışırken saatler sonra gcc 4.7 ile ve derleme değildir.

#include <utility>
#include <iostream>

template< class T >
class Y {

    public:
        template < typename = typename std::enable_if< true >::type >
        T foo() {
            return 10;
        }
        template < typename = typename std::enable_if< false >::type >
        T foo() {
            return 10;
        }

};


int main() {
    Y< double > y;

    std::cout << y.foo() << std::endl;
}

gcc aşağıdaki sorunlar bildirildi

% LANG=C make CXXFLAGS="-std=c  0x" enable_if
g   -std=c  0x    enable_if.cpp   -o enable_if
enable_if.cpp:12:65: error: `type' in `struct std::enable_if<false>' does not name a type
enable_if.cpp:13:15: error: `template<class T> template<class> T Y::foo()' cannot be overloaded
enable_if.cpp:9:15: error: with `template<class T> template<class> T Y::foo()'

Neden g ikinci üye işlevi için yanlış bir örnekleme sil değil mi? Boolean şablon parametresi true olduğunda, std::enable_if< bool, T = void >::type standart tek göre var. Ama neden g bu gibi SFİNAE dikkate almaz? Aşırı yükleme hata iletisini g ikinci üye işlevi silmez sorun geliyor sanırım ve bu aşırı yüklenme olması gerektiğine inanıyor.

CEVAP
7 AĞUSTOS 2011, Pazar


SFİNAE yalnızca bir şablon bağımsız değişken çıkarım yapmak yerine koyma kötü biçimlendirilmiş inşa yapar, çalışır. Böyle bir alternatifi yok.

Onu da düşündüm, ve std::is_same< T, int >::value ve aynı sonucu verir ! std::is_same< T, int >::value kullanmaya çalıştı.

Çünkü ne zaman bir sınıf şablonu örneği (hangi durumda oluşturduğunuz nesne tipi Y<int> arasında diğer davalar), başlatır tüm üye bildirimleri (mutlaka bunların tanımları/ceset!). Aralarında da üye şablonlar vardır. T sonra bilinir, ve !std::is_same< T, int >::value yanlış verir unutmayın. İçeren bir sınıf Y<int> oluşturur

class Y<int> {
    public:
        /* instantiated from
        template < typename = typename std::enable_if< 
          std::is_same< T, int >::value >::type >
        T foo() {
            return 10;
        }
        */

        template < typename = typename std::enable_if< true >::type >
        int foo();

        /* instantiated from

        template < typename = typename std::enable_if< 
          ! std::is_same< T, int >::value >::type >
        T foo() {
            return 10;
        }
        */

        template < typename = typename std::enable_if< false >::type >
        int foo();
};

std::enable_if<false>::type mevcut olmayan bir tür erişir, bu beyanı kötü oluşur. Ve böylece programınız geçersiz.

Üye şablonları' enable_if üye şablonun bir parametre bağlıdır etmek zorundasın. Sonra Bildirimleri tüm yazın hala bağımlı olduğu için geçerlidir. Bunlardan birini aramak için çalıştığınızda, onların şablon bağımsız değişken kesinti oldu ve SFİNAE beklendiği gibi olur. this question ve bunu nasıl doğru cevabına bakın.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • michellefeng's channel

    michellefeng

    26 Kasım 2006
  • Microsoft Research

    Microsoft Re

    24 EKİM 2008
  • RyanXLT

    RyanXLT

    22 Ocak 2011