Derleme, herhangi bir uyumlu derleyicide başarısız olmalıdır.
SFINAE kuralları, açıklamalara değil, tanımlara dayanmaktadır.
template < /* substitution failures here are not errors */ >
struct my_struct {
// Substitution failures here are errors.
};
bir fonksiyonu için: Ek olarak
template </* substitution failures here are not errors */>
/* substitution failures here are not errors */
my_function(/* substitution failures here are not errors */) {
/* substitution failures here are errors */
}
bir sınıf/yapı için
: (. Ben burada yanlış terminoloji kullanarak olmam durumunda Maalesef) Demek şudur Verilen şablon argümanları dizisi için yapının/fonksiyonun varlığı da SFINAE kurallarına tabidir.
Artık bir static_assert
, yalnızca ikame arızalarının hata olduğu bölgelerde görünebilir ve bu nedenle, eğer bir yangın çıkarsa, bir derleyici hatası alırsınız. o zaman kod derler ve çıkışlar
false
için
enable_if
uzmanlaflmas kaldırırsanız Sonra
// Primary template (OK)
template <bool, typename T>
struct enable_if;
// Specialization for true (also OK)
template <typename T>
struct enable_if<true, T> {
using type = T;
};
// Specialization for false (Wrong!)
template <typename T>
struct enable_if<false, T> {
static_assert(std::is_same<T, T*>::value, "No SFINAE here");
// The condition is always false.
// Notice also that the condition depends on T but it doesn't make any difference.
};
bu
template <typename T>
typename enable_if<std::is_integral<T>::value, int>::type
test(const T &t);
void test(...);
int main()
{
std::cout << std::is_same<decltype(test(0)), int>::value << std::endl; // OK
std::cout << std::is_same<decltype(test(0.0)), void>::value << std::endl; // Error: No SFINAE Here
}
deneyin:
Örneğin şu enable_if
bir yanlış uygulama olur
1
1
olası yinelenen [Bir müşteriyi birincil şablon yerine açıkça özelleştirilmiş bir şablonu çağırmaya nasıl zorlayabilirim?] (http://stackoverflow.com/questions/16286303/how-can-i-force-a-client-to-call- bir-açıkça-özelleştirilmiş-şablon yerine-of-t) –