enable_if O SFINAE enable_if
ile decltype
kullanarak basit değilmiş.kullanarak go
'u üç farklı şekilde yazmayı denedim. Hepsi bir derleyici hatası ile başarısız oldu (GCC ile tam anlamıyla: "hata: 'şey', 'foo' nun bir üyesi ve bir somutlaşma bağlamı değildir). enable_if
bile işlevini ekarte etmek fırsatı olmadan gerçekleşmesi gerekiyor decltype
-Karıştırma decltype ve
#include <type_traits>
struct foo {
enum { has_thing = false };
};
struct bar {
enum { has_thing = true };
static int thing() { return 0; }
};
template <typename T>
struct Test {
/*auto go(typename std::enable_if<T::has_thing, int>::type=0)
-> decltype(T::thing()) {
return T::thing();
}*/
/*typename std::enable_if<T::has_thing, decltype(T::thing())>::type go() {
return T::thing();
}*/
template <bool B=T::has_thing, typename std::enable_if<B, int>::type = 0>
auto go() -> decltype(T::thing()) {
return T::thing();
}
};
int main() {
Test<bar> b;
Test<foo> f;
}
Sorunun ne görebiliriz. Kalan soru, etrafta nasıl çalışılacağı ve benzer davranışların nasıl ele alınacağıdır?içinde kullanmak için has_thing
özellik yazma başvurmadan basit, genel bir yolu var mı? G, her iki ile test edilmiştir
++ 4.7 ve çınlama ++ 3.0. senin SFINAE çalışmıyor Tabii
Derleyici hatasını gönderir misiniz? Ayrıca, derleyici sürümü yardımcı olacaktır. Bu bölümdeki derleyiciler hala çok yorucu olduğu deneyimlerinden söyleyebilirim. –