::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
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.
Neden std kaçınmalısınız::enable_if iş...
Değil'benim derleme bağlama t: ta...
Neden herhangi bir parametre (asıl fon...
Neden bu C derleme (non-void işlev bir...
"açmak" eşleşen bir işlev iş...